一、位运算符
Java 定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。
位运算符作用在所有的位上,并且按位运算。假设 A = 60,B = 13; 它们的二进制格式表示将如下:
A = 0011 1100
B = 0000 1101
-----------------
A & B = 0000 1100
A | B = 0011 1101
A ^ B = 0011 0001
~A = 1100 0011
下面是一种二进制换算成十进制的方式:
0011 1100
8421 8421
| |
2+1 8+4
| |
3*16^1+12*16^0=60
下表列出了位运算符的基本运算,假设整数变量 A 的值为 60 和变量 B 的值为 13:
操作符 | 名称 | 描述 | 例子 |
---|---|---|---|
& | 与 | 如果相对应位都是1,则结果为1,否则为0 | (A&B)得到 12,即 0000 1100 |
| | 或 | 如果相对应位都是0,则结果为0,否则为1 | (A | B)得到 61,即 0011 1101 |
^ | 异或 | 如果相对应位值相同,则结果为0,否则为1 | (A ^ B)得到 49,即 0011 0001 |
〜 | 非/取反 | 按位取反,翻转操作数的每一位,即0变成1,1变成0 | (〜A)得到 -61,即 1100 0011 |
<< | 左移 | 按位左移,左操作数按位左移右操作数指定的位数 | A << 2 得到 240,即 1111 0000 |
>> | 右移 | 按位右移,左操作数按位右移右操作数指定的位数 | A >> 2 得到 15,即 1111 |
>>> | 无符号右移 | 按位右移补零,左操作数的值按右操作数指定的位数右移, 移动得到的空位以零填充 | A >>> 2 得到 15,即 0000 1111 |
例子1:用最有效率的方法算出 2 乘以 8 等于几
2 << 3(相当于:2*2^3 == 2*8)
将一个数左移 n 位,就相当于乘以了 2 的 n 次方,那么,一个数乘以 8 只要将其左移 3 位即可,而
位运算是 cpu 直接支持的,效率最高
,所以,2 乘以 8 等于几的最效率的方法是 2 << 3。
例子2:用位运算 & 取代 % 取模
关系如下:
X % 2^n = X & (2^n – 1)
也就是说,用位运算 & 来取代 % 取模需要被取模的数必须是2的幂才成立,如:
n % 4 = n & 3
n % 8 = n & 7
对 % 和 & 进行了一个简单的性能测试,对 0~Integer.MAX 所有的数分别 % 和 & ,消耗的时间如下:
% time: 1.847528994 sec
& time: 0.00163733 sec
参考文章:
1、http://www.runoob.com/java/java-operators.html
2、https://blog.csdn.net/johnny901114/article/details/80456833