马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
编写一个函数rightrot(x, n),该函数返回将x循环右移(即从最右端移出的位将从最左端移入)n(二进制)位后所得到的值。
这个函数的两种形式我认为是等价的
但是实验告诉我,不等价
谁能告诉我为什么第二种错了
第一种
int rightrot(unsigned int x , int n)
{
int k,i,m;
int ribits;
k = x;
for ( i = 0; k!=0; i++)
{
k=k>>1;
}
ribits = (~(~0<<n) & x)<<(i-n);
x = (x>>n) | ribits;
return x;
}
第二种int rightrot(unsigned int x , int n)
{
int k,i,m;
int ribits;
k = x;
for ( i = 0; k!=0; i++)
{
k=k>>1;
}
ribits = ((~0<<n) | x)<<(i-n);
x = (x>>n) | ribits;
return x;
}
设x=122(二进制:1111 010)
设n=3
ribits = ((~0<<n) | x)<<(i-n);
~0: 1111111
~0<<n:1111000
~0<<n | x: 1111010
(~0<<n | x)<<(i-n):0100000
设x=122(二进制:1111 010)
设n=3
ribits = (~(~0<<n) & x)<<(i-n);
~0: 1111111
~0<<n; 1111000
~(~0<<n): 0000111
~(~0<<n)& x: 0000010
(~(~0<<n)& x)<<(i-n): 0100000
x = (x >> 1) | (x & 0x01 ? 0x80000000 : 0);
x & 0x01 就是 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
&
00000000 00000000 00000000 00000000
=
00000000 00000000 00000000 0000000?
就是看最低位是0还是1
如果是1那就
x = (x >> 1) | 0x80000000;
就是or上
10000000 00000000 00000000 00000000
0x80000000就是最高位为1
如果是0,那就or上0,结果就是和没有or一样
|