0

a%b をすばやく取得するために、ユニオンで匿名構造体を使用しています。

b に 2 の累乗を使用せずに a%b を取得する他の方法を知っていますか?

リストを含める:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

および労働組合の宣言:

//C99
//my first program to test rand() for any periodicity
union //for array indexing without modulus operator
{
unsigned int counter; //32 bit on my computer
struct
{
    unsigned int lsb:16; //16 bit 
    unsigned int msb:16; //16 bit   
};
struct 
{
    unsigned int bit[32];
};
} modulo;

union // for rand()%256
{
unsigned int randoom; //from rand() 
struct
{
unsigned int lsb:5;//equivalent to rand()%32 without any calculations
unsigned int msb:27;
};
}random_modulus;

そしてここに主な機能があります:

int main()
{
srand(time(0));

modulo.counter=0;//init of for-loop counter

// i am takin (counter%65536) for my array index which is modulus.lsb
unsigned int array_1[65536]; 
float array_mean=0,delta_square=0;
clock_t clock_refe;


//taking counter%65536 using lsb (2x faster)
clock_refe=clock();
for(;modulo.counter<1000000000;modulo.counter++)
{
// i need accumulated randoms for later use for some std. dev. thing.
random_modulus.randoom=rand();
array_1[modulo.lsb]+=random_modulus.lsb;
}

//getting average clock cycles
for(int i=0;i<65536;i++)
{
array_mean+=array_1[i];

}
array_mean/=65536.0f;

//getting square of deltas
float array_2[65536];

for(int i=0;i<65536;i++)
{
array_2[i]=(array_1[i]-array_mean)*(array_1[i]-array_mean); 
}


//horizontal histogram for resoluton of 20 elements
for(int i=0;i<65536;i+=(65536)/20)
{


for(int j=0;j<(array_2[i]*0.01);j++)
{

    printf("*");
}
printf("\n");
}

//calculations continue .....
return 0;

}

おそらくいくつかの配列で事前に計算された値ですか?しかし、% calc の部分を 1 回だけ使用する場合、これは同じです。ビット単位の操作マニュアルに関する書籍の参考文献を教えてください。

4

1 に答える 1

1

この場合、ビット演算は最も移植性の高い方法です。関数の例を次に示します。これらは読みやすくするために書かれていますが、簡単に高速化できます。

int lsb(int input) {
    int mask = 0x00FF; // 0x00FF is 0000000011111111 in binary
    return input & mask;
}

int msb(int input) {
    int mask = 0xFF00; // 0xFF00 is 1111111100000000 in binary
    return (input & mask) >> 8;
}

一般に、必要なビットを でマスクし&てから、 で右に揃えます>>。K&R 第 2 版 (Brian Kernighan と Dennis Ritchie による C プログラミング言語) には、ビットマスクを含むほぼすべての C トピックに関する情報があります。

a % bwhereが 2 の累乗でない場合bは、ネイティブ%演算子が最速の方法です (最新のコンパイラでは、 is が 2 の累乗であっても、ビット演算と同じくらい高速ですb)。ただし、ビット演算は他のコンテキストでも役立ちます。

于 2012-07-13T08:23:36.817 に答える