黑马程序员技术交流社区
标题:
移位补零问题
[打印本页]
作者:
jiangenhao
时间:
2014-4-19 11:20
标题:
移位补零问题
本帖最后由 jiangenhao 于 2014-4-21 22:20 编辑
对a的后四位取反
int a =6 ;
a = n << 28; //左移28位;只留后四位
int b = ~a ; //对n取反;
int c = b >> 28; //右移28位;
复制代码
因为a的二进制表示为:
0000 0000 0000 0000 0000 0000 0000 0110
左移28位移位之后为
0110 0000 0000 0000 0000 0000 0000 0000
取反之后为
1001 1111 1111 1111 1111 1111 1111 1111
右移28位后为
1111 1111 1111 1111 1111 1111 1111 1001
而我希望得到的结果是
0000 0000 0000 0000 0000 0000 0000 1001
请问怎样才能实现右移时前面位数补0而不是补1
作者:
微尘•逐梦
时间:
2014-4-19 11:30
一般情况下是补零,但在处理有符号数的时候会因计算机系统的不同而不同。有符号数高位是零,则右移时高位补零;如果是负数,即高位是1,那么,有得系统会移入1,称算术右移,有的会移入0,称逻辑右移。无符号整形移位时都是补零,所以你将需要移位的数据类型定义成无符号整形就能使右移时补零。
作者:
Dmajor
时间:
2014-4-19 12:16
如果a<15,可以用15-a得到后四位取反
15<a<255,可以用255-a得到后八位取反
依次类推
作者:
blz01003hm
时间:
2014-4-19 12:22
int a =6 ;
a = n << 28; //左移28位;只留后四位
int b = ~a ; //对n取反;
int c = b >> 28; //右移28位;
c=c&(~0);//消掉多余的1
作者:
悠悠·漠漠
时间:
2014-4-19 16:51
LZ要对a的后四位取反,只需要将a异或上15不就可以了!
int a =6
a=a^15;
复制代码
作者:
星河鹭起
时间:
2014-4-19 16:56
后四位取反很简单,并不需要进行移位,只要将数据异或15就可以了,也就是二进制异或0000 0000 0000 0000 0000 0000 0000 1111 相同为0,不同为1
作者:
魅影穿眸
时间:
2014-4-19 21:08
楼主,a^15是最快的方法,如果右移时前面位数补0,就把他生命为无符号数
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2