计算机数据表示是通过 0,1
两个数字存储的;比如 int a = 8;
那么在计算机上其实是用1000
来表示;
它的计算方式,从低位开始,用 n 位上的数字乘以 2的n 次方,最后相加求和;
比如:0*2^0 + 0*2^1 + 0*2^2 + 1*2^3
,结果就是 1*2^3 = 8
一、符号介绍
计算机是二进制的表示,比如 int 类型是32位:00000000 00000000 00000000 00000000
,即32个0表示十进制0
// 11 和 12 都是10进制的。在编程中我们是使用10进制表达的,但是计算机存储是按照二进制存储的
int a = 11; // 二进制:00000000 00000000 00000000 00001011,或者 1011
int b = 12; // 二进制:00000000 00000000 00000000 00001100,或者 1100
-
按位与
&
,a & b,结果是 1000 -
按位或
|
,a | b,结果是 1111 -
按位异或
^
,a^b ,结果是 111 -
按位右移
>>
,a >> 2,结果是 10 ;向右移动2位(去掉最右边的2位),左边补0 -
按位左移
<<
,a << 2,结果是 101100 ; 向左移动2位(去掉最左边的2位),右边补0 -
按位非
~
,~a,结果是 10000000 00000000 00000000 00001100
二、位运算符规则
与(&) | 0 & 0 = 0 | 1 & 0 = 0 | 0 & 1 = 0 | 1 & 1 = 1 |
或(|) | 0 | 0 = 0 | 1 | 0 = 1 | 0 | 1 = 1 | 1 | 1 = 1 |
异或(^) | 0 ^ 0 = 0 | 1 ^ 0 = 1 | 0 ^ 1 = 1 | 1 ^ 1 = 0 |
与:两个都是1,结果是1
或:只要有一个是1,结果就是1
异或:0异或任何数结果都是那个数,1异或任何数结果就是那个数取反
三、取反
~a 参考如下四步进行:
00000000 00000000 00000000 00001011 //先获得 a 的二进制表达
11111111 11111111 11111111 11110100 //将所有位取反
10000000 00000000 00000000 00001011 //第一位符号位不变,其他位再取反
10000000 00000000 00000000 00001100 //然后 +1,满2进1,最终得到的是 -12
四、编程实战
代码的详细解读,可以参考视频教程;
public class C18 {
public static void main(String[] args) {
int a = 11; //1011
int b = 12; //1100
System.out.println(a & b); //1000
System.out.println(a | b); //1111
System.out.println(a ^ b); //111
System.out.println(~a); //10000000 00000000 00000000 00001100
System.out.println(a << 2); //101100
System.out.println(a >> 2); //10
}
}