黑马程序员技术交流社区

标题: 移位补零问题 [打印本页]

作者: jiangenhao    时间: 2014-4-19 11:20
标题: 移位补零问题
本帖最后由 jiangenhao 于 2014-4-21 22:20 编辑

对a的后四位取反
  1. int a =6 ;
  2.           a = n << 28; //左移28位;只留后四位
  3.     int b =    ~a ; //对n取反;
  4.     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不就可以了!
  1. int a =6
  2. 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