mirror of
https://github.com/tursom/prime_numbers_c.git
synced 2025-03-21 21:00:28 +08:00
针对最为耗时的摸消3的倍数的操作进行了优化
This commit is contained in:
parent
7d138d7c36
commit
3f780c28b9
26
bit_set.c
26
bit_set.c
@ -33,14 +33,22 @@ size_t neededSize(unsigned long maxNumber) {
|
||||
|
||||
void getPrimeNumbers(unsigned long maxNumber, unsigned char *buffer) {
|
||||
size_t needSize = neededSize(maxNumber);
|
||||
unsigned long defaultValue = ~((unsigned long) 0);
|
||||
for (unsigned long *k = ((unsigned long *) buffer) + (needSize >> 3) - 1; k >= (unsigned long *) buffer; --k) {
|
||||
*k = defaultValue;
|
||||
unsigned char arr[] = {219, 182, 109};
|
||||
unsigned char initIndexArr[] = {1, 2, 0};
|
||||
unsigned char initIndex = 0;
|
||||
unsigned char *endP = buffer + needSize;
|
||||
|
||||
// 初始化缓冲区
|
||||
for (unsigned char *k = buffer + 1; k < endP; ++k) {
|
||||
*k = arr[initIndex];
|
||||
initIndex = initIndexArr[initIndex];
|
||||
}
|
||||
*buffer = 0xfe;
|
||||
*buffer = 0x6e;
|
||||
|
||||
// 进行计算
|
||||
unsigned int sqrtMaxNumber = (unsigned int) sqrt(maxNumber) >> 1;
|
||||
maxNumber >>= 1;
|
||||
for (size_t i = 1; i <= sqrtMaxNumber; i++) {
|
||||
for (size_t i = 2; i <= sqrtMaxNumber; i++) {
|
||||
if (buffer[i >> 3] & 1 << (i & 7)) {
|
||||
size_t doubleI = i + i + 1;
|
||||
for (size_t j = (doubleI * doubleI) >> 1; j < maxNumber; j += doubleI) {
|
||||
@ -48,8 +56,10 @@ void getPrimeNumbers(unsigned long maxNumber, unsigned char *buffer) {
|
||||
}
|
||||
}
|
||||
}
|
||||
needSize <<= 2;
|
||||
for (int l = (maxNumber + 1) >> 1; l < needSize; l++) {
|
||||
|
||||
// 去除多余结果
|
||||
needSize <<= 3;
|
||||
for (int l = maxNumber; l < needSize; l++) {
|
||||
buffer[l >> 3] &= ~(1 << (l & 7));
|
||||
}
|
||||
}
|
||||
@ -87,7 +97,7 @@ char ByteCode(const unsigned char n) {
|
||||
#pragma clang diagnostic push
|
||||
#pragma ide diagnostic ignored "hicpp-signed-bitwise"
|
||||
|
||||
void printByteMap(const unsigned char n) {
|
||||
void printByteMap(unsigned char n) {
|
||||
printf("%d %d %d %d %d %d %d %d",
|
||||
(n & 1) != 0, (n & 0x2) != 0, (n & 0x4) != 0, (n & 0x8) != 0,
|
||||
(n & 0x10) != 0, (n & 0x20) != 0, (n & 0x40) != 0, (n & 0x80) != 0);
|
||||
|
5
main.c
5
main.c
@ -1,3 +1,6 @@
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wunknown-pragmas"
|
||||
#pragma ide diagnostic ignored "hicpp-signed-bitwise"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
@ -149,3 +152,5 @@ int main(int argc, char *argv[]) {
|
||||
free(buff);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#pragma clang diagnostic pop
|
Loading…
Reference in New Issue
Block a user