位运算符
计算机的最底层就是 0 , 1
两个数字,比如 int a = 8;
那么在计算机上其实是用 1000
来表示的,从低位开始,就是: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
二、位运算符规则
与(&) | 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 & 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
// ~a 参考如下四步进行:
00000000 00000000 00000000 00001011 //先获得 a 的二进制表达
11111111 11111111 11111111 11110100 //将所有位取反
10000000 00000000 00000000 00001011 //第一位符号位不变,其他位再取反
10000000 00000000 00000000 00001100 //然后 +1,满2进1,最终得到的是 -12
三、代码实战
代码的详细解读,可以参考视频教程
package com.qicong.cj;
/**
* User: 祁大聪
*/
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
}
}