|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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一样
复制代码
|
|