【方向盘】Java二进制和位运算,这一万字准能喂饱你(中)

简介: 【方向盘】Java二进制和位运算,这一万字准能喂饱你(中)

Java中的位运算


image.png


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


相关文章
|
3月前
|
编解码 算法 Java
Java中的位运算详解
Java中的位运算详解
|
5月前
|
Java
Java中整数(负数)的二进制表示
Java中整数(负数)的二进制表示
|
5月前
|
Java
Java打印二进制
Java打印二进制
101 0
|
5月前
|
Java
Java中将一个数转化为二进制
Java中将一个数转化为二进制
62 0
|
4月前
|
算法 Java Go
【经典算法】LeetCode 67. 二进制求和(Java/C/Python3/Golang实现含注释说明,Easy)
【经典算法】LeetCode 67. 二进制求和(Java/C/Python3/Golang实现含注释说明,Easy)
39 2
|
4月前
|
Java
剑指offer_3_前n个数字二进制形式中1的个数(java)
剑指offer_3_前n个数字二进制形式中1的个数(java)
|
4月前
|
Java
剑指offer_2_二进制加法(java)
剑指offer_2_二进制加法(java)
|
5月前
|
Java
Java 运算符详解(取模、位运算、运算符的执行顺序)
Java 运算符详解(取模、位运算、运算符的执行顺序)
89 0
|
4月前
|
算法 Java
Java数据结构与算法:位运算之位移操作
Java数据结构与算法:位运算之位移操作
|
4月前
|
算法 Java
Java数据结构与算法:位运算之与、或、异或运算
Java数据结构与算法:位运算之与、或、异或运算
下一篇
无影云桌面