帮我写一个代码,完成下面这个练习(用位运算和移位运算将一个整数110从右端开始的4到7位变成0)我自己思路都没有..如有能人看到..帮我写一个出来我学习学习..谢谢..

解决方案 »

  1.   

    int a = 110;
    int b = a | 0xFF87; //(1111,1111,1000,0111)
    System.out.println(b);
      

  2.   

    纠正一下,弄错了
    int   a   =   110; 
    int   b   =   a   &   0xFF87;   //(1111,1111,1000,0111) 
    System.out.println(b);
      

  3.   

    改成 a & 0xFFFFFF87 会更好一些的。
      

  4.   

    int 110转化为二进制表示就是 0110 1110,要求是将从右端起第4位到第7位变为0,就是说原0110 1110 应转化为 0000 0110,现在二进制值0000 0110实际就是十进制的6了.通过使用>>>运算符(该运算符运算后在高位补0,>>运算符是在高位补符号位),将0110 1110右移4位,即可得到0000 0110.int i = 110;
    int afterShift = i>>>4;afterShift = 6 即0000 0110
      

  5.   

    6楼的解释不错,可是还能不能再具体点,什么叫做高位补0
    “通过使用> > > 运算符(该运算符运算后在高位补0,> > 运算符是在高位补符号位),将0110   1110右移4位,即可得到0000   0110”
    这句话不明白,还有能不能再解释下这句:int b = a & 0xFF87;
      

  6.   

    与运算,&0为0,&1不变,将4-7位添上4个0,其余位为1,然后&
      

  7.   

    用右移运算,是碰巧了,如果不是0110 1110,而是1110 1110呢?
    右移4位是0000 1110,但正确的应该是1000 0110
    int b = a & 0xFF87;//这里高16位我省略了,因为110的二进制高16位都是0,但是要知道实际上int占4个字节,有32位
    110的二进制0000 0000 0110 1110(只看低16位,因为高16位都是0,这个问题可以不考虑),现在要把右边开始第4到第7位变为0,即变为0000 0000 0000 0110
    首先,你要知道对于二进制 1 & 0 = 0, 1 & 1 = 1,所以,要保持某位的值不变,就 & 1, 要使某位的值为0,就 & 0,即
      0000 0000 0110 1110
    & 1111 1111 1000 0111 (从右开始4-7位为0,其余都是1)
    ----------------------
      0000 0000 0000 0110其中二进制1111就是16进制F,1000是8,0111是7,所以
    1111 1111 1000 0111就是FF87,java中的十六进制是以0x开头,即0xFF87
    所以int b = a & 0xFF87;就是这么来的。
    这样说明,LZ明白了吗?
     
      

  8.   

    2楼的方法是最好的是要用 OXFFFFFF87.因为INT为4个字节的