A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jiangenhao 中级黑马   /  2014-4-19 11:20  /  1599 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

6 个回复

倒序浏览
一般情况下是补零,但在处理有符号数的时候会因计算机系统的不同而不同。有符号数高位是零,则右移时高位补零;如果是负数,即高位是1,那么,有得系统会移入1,称算术右移,有的会移入0,称逻辑右移。无符号整形移位时都是补零,所以你将需要移位的数据类型定义成无符号整形就能使右移时补零。

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
如果a<15,可以用15-a得到后四位取反
      15<a<255,可以用255-a得到后八位取反
依次类推
回复 使用道具 举报
int a =6 ;
          a = n << 28; //左移28位;只留后四位
    int b =    ~a ; //对n取反;
    int c = b >> 28; //右移28位;
    c=c&(~0);//消掉多余的1

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
LZ要对a的后四位取反,只需要将a异或上15不就可以了!
  1. int a =6
  2. a=a^15;
复制代码
回复 使用道具 举报
后四位取反很简单,并不需要进行移位,只要将数据异或15就可以了,也就是二进制异或0000 0000 0000 0000 0000 0000 0000 1111  相同为0,不同为1
回复 使用道具 举报
楼主,a^15是最快的方法,如果右移时前面位数补0,就把他生命为无符号数
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马