Java位运算符
计算机内部的数据都以二进制的形式存在,二进制数据最高位是符号位,正数是0,负数为1;正数的原码、反码、补码都是一样的,负数的反码为原码的符号位不变,其它位取反,即0->1,1->0;而负数的补码等于反码加1;0的反码、补码都是0;在计算机进行运算的时候,都是以补码的方式运算。
Java语言中的位运算符主要有4种:&(位与)、|(位或)、^(异或)和~(按位取反),下面依次介绍运算规则和使用示例。
& (位与):
运算规则:二进制位都为1,则结果为1,否则为0。
例如:
正数:
3&5
3的二进制形式为:0000 0000 0000 0000 0000 0000 0000 0011
5的二进制形式为:0000 0000 0000 0000 0000 0000 0000 0101
因为3和5都是整数,所以补码就是它们的原码,即二进制形式。
根据计算规则,结果为:0000 0000 0000 0000 0000 0000 0000 0001, 即1。
负数:
-3&-6
-3的二进制形式为:1000 0000 0000 0000 0000 0000 0000 0011
-6的二进制形式为:1000 0000 0000 0000 0000 0000 0000 0110
-3的二进制反码为:1111 1111 1111 1111 1111 1111 1111 1100
-6的二进制反码为:1111 1111 1111 1111 1111 1111 1111 1001
-3的二进制补码(反码+1)为:1111 1111 1111 1111 1111 1111 1111 1101
-6的二进制补码(反码+1)为:1111 1111 1111 1111 1111 1111 1111 1010
根据-3和-6的补码进行&运算,结果为:1111 1111 1111 1111 1111 1111 1111 1000
结果为负数,所以需再换算,把所得的补码换算成原码,即-1得到反码, 再反码得到原码:
结果的反码为:1111 1111 1111 1111 1111 1111 1111 0111
再反码得到原码:1000 0000 0000 0000 0000 0000 0000 1000, 即-8。
代码测试:
public class BitOperator {
public static void main(String[] args) {
System.out.println(“3&5: “+(3&5));
System.out.println(“(-3)&(-6): “+((-3)&(-6)));
}
}
输出:
3&5: 1
(-3)&(-6): -8
| (位或):
运算规则:二进制位有一个为1,则结果为1,否则为0。
例如:
正数:
3|5
3的二进制形式为:0000 0000 0000 0000 0000 0000 0000 0011
5的二进制形式为:0000 0000 0000 0000 0000 0000 0000 0101
因为3和5都是整数,所以补码就是它们的原码,即二进制形式。
根据计算规则,结果为:0000 0000 0000 0000 0000 0000 0000 0111, 即7。
负数:
-3|-6
-3的二进制形式为:1000 0000 0000 0000 0000 0000 0000 0011
-6的二进制形式为:1000 0000 0000 0000 0000 0000 0000 0110
-3的二进制反码为:1111 1111 1111 1111 1111 1111 1111 1100
-6的二进制反码为:1111 1111 1111 1111 1111 1111 1111 1001
-3的二进制补码(反码+1)为:1111 1111 1111 1111 1111 1111 1111 1101
-6的二进制补码(反码+1)为:1111 1111 1111 1111 1111 1111 1111 1010
根据-3和-6的补码进行 | 运算,结果为:1111 1111 1111 1111 1111 1111 1111 1111
结果为负数,所以需再换算,把所得的补码换算成原码,即-1得到反码, 再反码得到原码:
结果的反码为:1111 1111 1111 1111 1111 1111 1111 1110
再反码得到原码:1000 0000 0000 0000 0000 0000 0000 0001, 即-1。
代码测试:
public class BitOperator {
public static void main(String[] args) {
System.out.println(“3|5: “+(3|5));
System.out.println(“(-3)|(-6): “+((-3)|(-6)));
}
}
输出:
3|5: 7
(-3)|(-6): -1
^ (异或):
运算规则:二进制位不同为1,相同为0。
例如:
正数:
3^5
3的二进制形式为:0000 0000 0000 0000 0000 0000 0000 0011
5的二进制形式为:0000 0000 0000 0000 0000 0000 0000 0101
因为3和5都是正数,所以补码就是它们的原码,即二进制形式。
根据计算规则,结果为:0000 0000 0000 0000 0000 0000 0000 0110, 即6。
负数:
-3^-6
-3的二进制形式为:1000 0000 0000 0000 0000 0000 0000 0011
-6的二进制形式为:1000 0000 0000 0000 0000 0000 0000 0110
-3的二进制反码为:1111 1111 1111 1111 1111 1111 1111 1100
-6的二进制反码为:1111 1111 1111 1111 1111 1111 1111 1001
-3的二进制补码(反码+1)为:1111 1111 1111 1111 1111 1111 1111 1101
-6的二进制补码(反码+1)为:1111 1111 1111 1111 1111 1111 1111 1010
根据-3和-6的补码进行 ^ 运算,结果为:0000 0000 0000 0000 0000 0000 0000 0111
结果为正数,所以无需再换算, 即7。
代码测试:
public class BitOperator {
public static void main(String[] args) {
System.out.println(“3^5: “+(3^5));
System.out.println(“(-3)^(-6): “+((-3)^(-6)));
}
}
输出:
3^5: 6
(-3)^(-6): 7
~ (按位取反):
运算规则:二进制位1变为0,0变为1。
例如:
正数:
~3
3的二进制形式为:0000 0000 0000 0000 0000 0000 0000 0011
根据计算规则,结果为:1111 1111 1111 1111 1111 1111 1111 1100。
结果为负数,所以需再换算,把所得的补码换算成原码,即-1得到反码, 再反码得到原码:
结果的反码为:1111 1111 1111 1111 1111 1111 1111 1011
再反码得到原码:1000 0000 0000 0000 0000 0000 0000 0100, 即-4。
负数:
~(-3)
-3的二进制形式为:1000 0000 0000 0000 0000 0000 0000 0011
-3的二进制反码为:1111 1111 1111 1111 1111 1111 1111 1100
-3的二进制补码(反码+1)为:1111 1111 1111 1111 1111 1111 1111 1101
根据-3的补码进行 ~ 运算,结果为:0000 0000 0000 0000 0000 0000 0000 0010
结果为正数,所以无需再换算, 即2。
代码测试:
public class BitOperator {
public static void main(String[] args) {
System.out.println(“~3: “+(~3));
System.out.println(“~(-3): “+(~(-3)));
}
}
输出:
~3: -4
~(-3): 2
实际使用简单示例:
原文:http://blog.csdn.net/mailbomb/article/details/2492361
l 把任意数字转换为正数
假设n是一个任意的整数,则把n转换为正数的代码为:
int m = n & 0x7fffffff;
l 判断任意数字倒数第三位的值是否为1
假设n是一个任意的整数,则判断的代码为:
int m = n & 0x4;
boolean b = (m != 0);
l 将任意数字倒数第四位置为1
假设n是一个任意的整数,则代码为:
int m = n | 0x8;
还没有评论,来说两句吧...