C:位运算(2)
/*the max length of unsigned int*/
int int_size ()
{
unsigned int bits;
int size = 0;
bits = ~0;
while ( bits ) {
++size;
bits >>= 1;
}
return size;
}
4.2移位运算
/*a bit mover for unsigned int
if n > 0 move left for n bits,else move right*/
unsigned int bit_shift (unsigned int value,int n)
{
int intsize=int_size(); /*the length of unsigned int*/
if(n>0 && n< intsize) /*move left*/
value<<=n;
else if (n<0 && n> -intsize) /*move right*/
value>>=-n;
else
value=0;
return value;
}
4.3循环移位运算
/*a bit rotate mover for unsigned int
if n > 0 move left for n bits,else move right*/
unsigned int bit_rotate (unsigned int value, int n)
{
unsigned int result,bits,intsize;
intsize=int_size(); /*the length of unsigned int*/
if(n > 0)
n=n % intsize;
else
n=-(-n % intsize);
if(n==0)
result=value;
else if(n >0 ){ /*move left*/
bits=value >> (intsize-n);/*bits should be in the rightest*/
result=value << n|bits;
}else{ /*move right*/
n=-n;
bits=value << (intsize-n);/*bits should be in the leftest*/
result=value >> n|bits;
}
return result;
}