今天在做leetcode每日一题中遇到了位运算,遂查阅资料后记录笔记。
Java提供的位运算符有:左移( << )、右移( >> ) 、无符号右移( >>> ) 、位与( & ) 、位或( | )、位非( ~ )、位异或( ^ ),除了位非( ~ )是一元操作符外,其它的都是二元操作符
1、左移( << )
将5左移两位:

public class Test {
    public static void main(String[] args) {
        System.out.println(5<<2);//运行结果是20
    }
}

运行结果是20,但是程序是怎样执行的呢?
首先会将5转为2进制表示形式(java中,整数默认就是int类型,也就是32位):

0000 0000 0000 0000 0000 0000 0000 0101           然后左移2位后,低位补0:
0000 0000 0000 0000 0000 0000 0001 0100           换算成10进制为20

2、右移( >> )
与左移相同,移动位置不同
3、无符号右移( >>> )
我们知道在Java中int类型占32位,可以表示一个正数,也可以表示一个负数。正数换算成二进制后的最高位为0,负数的二进制最高为为1。正数右移,高位用0补,负数右移,高位用1补

public class Test {
    public static void main(String[] args) {
        System.out.println(5>>3);//结果是0
        System.out.println(-5>>3);//结果是-1
        System.out.println(-5>>>3);//结果是536870911
    }
}

例如:
-5换算成二进制: 1111 1111 1111 1111 1111 1111 1111 1011
-5右移3位后结果为-1,-1的二进制为: 1111 1111 1111 1111 1111 1111 1111 1111
如果为无符号右移则补0,为 0001 1111 1111 1111 1111 1111 1111 1111,转换为10进制为536870911
4、位与( & )
位与:第一个操作数的的第n位于第二个操作数的第n位如果都是1,那么结果的第n为也为1,否则为0
5、位或( | )
第一个操作数的的第n位于第二个操作数的第n位 只要有一个是1,那么结果的第n为也为1,否则为0
6、位异或( ^ )
第一个操作数的的第n位于第二个操作数的第n位 相反,那么结果的第n为也为1,否则为0
7、位非( ~ )
操作数的第n位为1,那么结果的第n位为0,反之。
由位运算操作符衍生而来的有:

&=按位与赋值
|=按位或赋值
^=按位非赋值
>>=右移赋值
>>>=无符号右移赋值
<<=赋值左移

文章部分摘自:https://blog.csdn.net/xiaochunyong

Last modification:October 19th, 2021 at 01:47 pm
如果觉得我的文章对你有用,请随意赞赏