Модуль C с использованием союзов и анонимных структур
Я использую анонимные структуры в союзах, чтобы быстро получить% b.
Знаете ли вы какой-либо другой способ получить% b, не используя степени 2 для 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 ответ
Побитовые операции являются наиболее переносимым методом в этом случае. Вот несколько примеров функций; они написаны для удобства чтения, но могут быть легко сделаны быстрее:
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 2nd edition (Язык программирования C от Brian Kernighan & Dennis Ritchie) содержит информацию практически по каждой теме C, включая битовые маски.
Если ты хочешь a % b
где b
не степень 2, родной %
оператор - самый быстрый способ (в современных компиляторах он так же быстр, как и побитовые операции, даже когда b
это степень двух). Побитовые операции полезны и в других контекстах.