Java中的位运算
Java语言支持的位运算符还是非常多的,列出如下:
- &:按位与
- |:按位或
- ~:按位非
- ^:按位异或
- <<:左位移运算符
- >>:右位移运算符
- >>>:无符号右移运算符
除~以 外,其余均为二元运算符,操作的数据只能是整型(长短均可)或者char字符型。针对这些运算类型,下面分别给出示例,一目了然。
既然是运算,依旧可以分为简单运算和复合运算两大类进行归类和讲解。
小贴士:为了便于理解,字面量例子我就都使用二进制表示了,使用十进制(任何进制)不影响运算结果
简单运算
简单运算,顾名思义,一次只用一个运算符。
&:按位与
操作规则:同为1则1,否则为0。仅当两个操作数都为1时,输出结果才为1,否则为0。
说明:1、本示例(下同)中所有的字面值使用的都是十进制表示的,理解的时候请用二进制思维去理解;2、关于负数之间的位运算本文章统一不做讲述
@Test public void test() { int i = 0B100; // 十进制为4 int j = 0B101; // 十进制为5 // 二进制结果:100 // 十进制结果:4 System.out.println("二进制结果:" + Integer.toBinaryString(i & j)); System.out.println("十进制结果:" + (i & j)); }
|:按位或
操作规则:同为0则0,否则为1。仅当两个操作数都为0时,输出的结果才为0。
@Test public void test() { int i = 0B100; // 十进制为4 int j = 0B101; // 十进制为5 // 二进制结果:101 // 十进制结果:5 System.out.println("二进制结果:" + Integer.toBinaryString(i | j)); System.out.println("十进制结果:" + (i | j)); }
~:按位非
操作规则:0为1,1为0。全部的0置为1,1置为0。
小贴士:请务必注意是全部的,别忽略了正数前面的那些0哦~
@Test public void test() { int i = 0B100; // 十进制为4 // 二进制结果:11111111111111111111111111111011 // 十进制结果:-5 System.out.println("二进制结果:" + Integer.toBinaryString(~i)); System.out.println("十进制结果:" + (~i)); }
^:按位异或
操作规则:相同为0,不同为1。操作数不同时(1遇上0,0遇上1)对应的输出结果才为1,否则为0。
@Test public void test() { int i = 0B100; // 十进制为4 int j = 0B101; // 十进制为5 // 二进制结果:1 // 十进制结果:1 System.out.println("二进制结果:" + Integer.toBinaryString(i ^ j)); System.out.println("十进制结果:" + (i ^ j)); }
<<:按位左移
操作规则:把一个数的全部位数都向左移动若干位。
@Test public void test() { int i = 0B100; // 十进制为4 // 二进制结果:100000 // 十进制结果:32 = 4 * (2的3次方) System.out.println("二进制结果:" + Integer.toBinaryString(i << 2)); System.out.println("十进制结果:" + (i << 3)); }
左移用得非常多,理解起来并不费劲。x左移N位,效果同十进制里直接乘以2的N次方就行了,但是需要注意值溢出的情况,使用时稍加注意。
>>:按位右移
操作规则:把一个数的全部位数都向右移动若干位。
@Test public void test() { int i = 0B100; // 十进制为4 // 二进制结果:10 // 十进制结果:2 System.out.println("二进制结果:" + Integer.toBinaryString(i >> 1)); System.out.println("十进制结果:" + (i >> 1)); }
负数右移:
@Test public void test() { int i = -0B100; // 十进制为-4 // 二进制结果:11111111111111111111111111111110 // 十进制结果:-2 System.out.println("二进制结果:" + Integer.toBinaryString(i >> 1)); System.out.println("十进制结果:" + (i >> 1)); }
右移用得也比较多,也比较理解:操作其实就是把二进制数右边的N位直接砍掉,然后正数右移高位补0,负数右移高位补1。
>>>:无符号右移
注意:没有无符号左移,并没有<<<这个符号的
它和>>有符号右移的区别是:无论是正数还是负数,高位通通补0。所以说对于正数而言,没有区别;那么看看对于负数的表现:
@Test public void test() { int i = -0B100; // 十进制为-4 // 二进制结果:11111111111111111111111111111110(>>的结果) // 二进制结果:1111111111111111111111111111110(>>>的结果) // 十进制结果:2147483646 System.out.println("二进制结果:" + Integer.toBinaryString(i >>> 1)); System.out.println("十进制结果:" + (i >>> 1)); }
我特意把>>的结果放上面了,方便你对比。因为高位补的是0,所以就没有显示啦,但是你心里应该清楚是怎么回事。
复合运算
广义上的复合运算指的是多个运算嵌套起来,通常这些运算都是同种类型的。这里指的复合运算指的就是和=号一起来使用,类似于+= -=。本来这属于基础常识不用做单独解释,但谁让A哥管生管养,管杀管埋呢😄。
混合运算:指同一个算式里包含了bai多种运算符,如加减乘除乘方开du方等。
以&与运算为例,其它类同:
@Test public void test() { int i = 0B110; // 十进制为6 i &= 0B11; // 效果同:i = i & 3 // 二进制结果:10 // 十进制结果:2 System.out.println("二进制结果:" + Integer.toBinaryString(i)); System.out.println("十进制结果:" + (i)); }
复习一下&
的运算规则是:同为1则1,否则为0。