今天在看 JDK 源码中,关于 HashMap 的部分时,再次看到了
位运算符,之前因为很少用到,所以一直没有较为深入的了解过 位运算符(基本不懂那些运算符是干啥的),今天打算借着这次机会来稍稍深入的了解一下。
1 按位操作符
按位操作符有以下四种: &
按位与、 |
按位或、 ^
按位异或、 ~
按位非(按位非是一元操作符)
输出如下:
int a = 1;
int b = 0;
int c = 1;
-------------------------------------
按位 ‘与’(&) 操作符: a & b = 0
按位 ‘与’(&) 操作符: a & c = 1
-------------------------------------
按位 ‘或’(|) 操作符: a | b = 1
按位 ‘或’(|) 操作符: b | b = 0
-------------------------------------
按位 ‘异或’(^) 操作符: a ^ b = 1
按位 ‘异或’(^) 操作符: a ^ c = 0
-------------------------------------
按位 ‘非’(~) 操作符: ~(0) = -1
按位 ‘非’(~) 操作符: ~(1) = -2
按位 ‘非’(~) 操作符: ~(-1) = 0
按位 ‘非’(~) 操作符: ~(-2) = 1
-------------------------------------
Process finished with exit code 0
2 移位操作符
移位操作符有以下三种:
- 左移位运算符(<<),能按照操作符右侧指定的位数将操作符左边的操作数向左移动(在低位自动补 0
- “有符号”右移位操作符(>>),则按照操作符右侧指定的位数将操作符左边的操作数向右移动。“有符号”右移位操作符使用“符号扩展”:若符号为正,则在高位插入 0;若符号为负,则在高位插入 1。
- “无符号”右移位操作符(>>>),它使用“零扩展”:无论正负,都在高位插入 0
如果对 char、byte、short 类型的数值进行移位操作处理,那么在移位进行之前,他们会被转换为 int 类型,并且得到的结果也是一个 int 类型的值。 只有数值的右端的 低5位才有用。这样是为了防止移位超过 int 型值所具有的位数。
“移位”可与“等号”(<<=、>>=、>>>=)组合使用,操作符左边的值会先移动到操作符右边数值指定的位数,再将得到的结果赋给左边的变量。
Reference
1、《Java编程思想》