说明:位运算符都是作用在二进制上的
<< 左移
正数-负数
示例
比如 n = 50 ;
n << 1 结果是多少?100
n << 2 结果是多少? 200
n << 5 结果是多少? 1600
分析
为什么会是这样的呢?
运算的逻辑如下:
1,n = 50;
2,n的二进制是:0011 0010
3,0011 0010 左移一位 0110 0100;缺位补0或者1
4,然后再把0110 0100转成十进制结果为100
5,同理:<< 2,右移两位,<<5,右移五位
敲黑板:
n << 1 == n * 21
n << 5 == n * 25
n << a == n * 2a
>> 右移
正数
示例
比如 n = 50 ;
n >> 1 结果是多少?25
n >> 2 结果是多少?12
n >> 5 结果是多少?1
分析
为什么会是这样的呢?
运算的逻辑如下:
1,n=50;
2,n的二进制是:0011 0010
3,0011 0010 右移一位 000110 01 缺位补0
4,然后再把000110 01转成十进制结果为25
5,同理:>> 2,右移两位,>> 5,右移五位
敲黑板:
n >> 1 == n / 21
n >> 5 == n / 25
n >> a == n / 2a
注意:
n/2a 取整,这就是为什么n >> 2 == 12,n >> 2 != 12.5
负数
示例
比如 n = -50 ;
n >> 1 结果是多少?-25
n >> 2 结果是多少?-13
n >> 5 结果是多少?-2
分析
为什么会是这样的呢?
运算的逻辑如下:
1,首先要知道原码、反码和(补码 = 反码+1)
2,n = -50;
3,n的绝对值是 “50”
4,二进制:0000 0000 0000 0000 0000 0000 0011 0010;
5,反码是:1111 1111 1111 1111 1111 1111 1100 1101;
6,补码是:1111 1111 1111 1111 1111 1111 1100 1110;
7,同理:>> 2,右移两位,>> 5,右移五位,缺位补1
敲黑板:
n >> 1 == n / 21
n >> 5 == n / 25 -1
n >> a == n / 2a (-1)
注意:
n/2a 取整,如果有余数则再减一,且最小值只能为-1 这就是为什么 -50 >> 2 == -13,n >> 2 != -12
>>> 无符号右移
正数
和 >> 一样
负数
示例
比如 n = -50 ;
n >>> 1 结果是多少?2147483623
n >>> 2 结果是多少?1073741811
n >>> 5 结果是多少?134217726
分析
为什么会是这样的呢?
运算的逻辑如下:
1,首先要知道原码、反码和(补码 = 反码+1)
2,n = -50;
3,n的绝对值是 “50”,
4,二进制:0000 0000 0000 0000 0000 0000 0011 0010;
5,反码是:1111 1111 1111 1111 1111 1111 1100 1101;
6,补码是:1111 1111 1111 1111 1111 1111 1100 1110;
7,同理:>> 2,右移两位,>> 5,右移五位,缺位补0
8,神奇的时候出来了,这个缺位补了0,这个数字就变成了正整数了,所以一下子就变得很大
敲黑板:
敲不出来了
注意:
第八点很重要
| 或
示例-分析
比如 3|5 = 7
1,3的二进制:0011
2,5的二进制:0101
3,计算方式:同为0时为0,否则为1
4,结果就是:0111
5,转成十进制就是:7
^ 异或
示例-分析
比如 3^5 = 6
1,3的二进制:0011
2,5的二进制:0101
3,计算方式:相同则为0,不相同则为1
4,结果就是:0110
5,转成十进制就是:6
& 与
示例-分析
比如 -3& -5 = -12
1,-3的二进制:1111 1111 1111 1111 1111 1111 1111 1101
2,-10的二进制:1111 1111 1111 1111 1111 1111 1111 0110
3,计算方式:同为1时为1,否则为0
4,结果就是:1111 1111 1111 1111 1111 1111 1111 0100
5,转成十进制就是:-12
~ 非
示例-分析
比如 ~ -3 = 2
1,-3的二进制:1111 1111 1111 1111 1111 1111 1111 1101
2,计算方式:0转1,1转0
3,~-3的二进制:0000 0000 0000 0000 0000 0000 0000 0010
5,转成十进制就是:2