我明白了,Java里面int类型都是32位的,你的需求是:将一个整数110从右端开始的4-7位变为0 (注意这里不是从左端开始数)
所以应该将
110:
00000000000000000000000001101110
变为:
00000000000000000000000000000110
也就是要 与运算 一个这样的数:
xxxxxxxxxxxxxxxxxxxxxxxxx0000111
这里x可以是0或者1(因为110前面的二进制位都是0,所以x是0和1都无所谓),但是如果要保持相对应的位不变,x须为1。(如果给定的整数是-110,那么前面的二进制位就都是1了,x为0就不能满足要求了)
所以
int: 15, binary:
00000000000000000000000000001111
左移3位,然后再取反,正好符合要求。:)
~(15 << 3), int: -121, binary:
11111111111111111111111110000111
----------------
下面的代码可以打印出一个整数的二进制值,供你测试使用(核心代码来自Java编程思想):
public class BitOperation {
public static void main(String[] args) {
int a = 110;
pBinInt("a",a);
pBinInt("15",15);
int b = ~(15 << 3);
pBinInt("b",b);
pBinInt("a&b",a&b);
}
// 打印一个整数的二进制值
static void pBinInt(String s, int i) {
System.out.println(
s + ", int: " + i + ", binary: ");
//System.out.print(" ");
for(int j = 31; j >=0; j--)
if(((1 << j) & i) != 0)
System.out.print("1");
else
System.out.print("0");
System.out.println();
}
// 打印一个长整数的二进制值
static void pBinLong(String s, long l) {
System.out.println(
s + ", long: " + l + ", binary: ");
System.out.print(" ");
for(int i = 63; i >=0; i--)
if(((1L << i) & l) != 0)
System.out.print("1");
else
System.out.print("0");
System.out.println();
}
}
与 一个 长度相同
4-7 是 0 其他都是 1 的 数
int a=110;//二进制数是1101110
a=a & 7;
//你想从右4-7位也就是110来说左边4位了。那就用7(111)
结果a=6(0000110)