前言:
符号 | 描述 | 运算规则 |
---|---|---|
& | 与 | 同为1时,结果为1 |
| | 或 | 同为0时,结果为0 |
^ | 异或 | 相同为0,不同为1 |
<< | 左移 | 各二进位全部左移若干位,高位丢弃,低位补0 |
>> | 右移 | 各二进位全部右移若干位,低位丢失,高位补0 |
~ | 取反 | 0变1,1变0 |
一、与运算符(&
)
运算规则:
同为1的时候结果为1,不同的时候结果为0,同为0的时候也为0
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
例如:3 & 4
3(0000 0011)
&
4(0000 0100)
------------
=
0(0000 0000)
二、或运算符(|
)
运算规则:
同为0的时候结果为0,同为1的时候结果为1,不相同的时候结果为1(只有同为0的时候结果才为0,其他情况都为1,只要出现1结果就为1)
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
例如: 3 | 4
3(0000 0011)
|
4(0000 0100)
------------
=
7(0000 0111)
三、异或运算符(^
)
运算规则:
同为0,不同为1
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
注意:
异或运算不管0还是1,只要遇到相同的就为0,只要遇到不相同就为1
例如:3 ^ 4
3(0000 0011)
^
4(0000 0100)
------------
=
7(0000 0111)
特例:
异或运算还可以做用于两个数的交换
公式:
a = a ^ b
b = a ^ b
a = a ^ b
举例:
1. 定义两个数值性常量a,b
2. a = 3,b = 5
3. 交换a,b的值
4. 输出a,b交换后的结果
步骤一:a = a ^ b
a = a ^ b
a = 3 ^ 5
a = 6
a(0000 0011) = 3
^
b(0000 0101) = 5
-----------------
=
a(0000 0110) = 6
步骤二:b = a ^ b
b = a ^ b
b = 6 ^ 5
b = 3
a(0000 0110) = 6
^
b(0000 0101) = 5
-----------------
=
b(0000 0011) = 3
步骤三:a = a ^ b
a = a ^ b
a = 6 ^ 3
a = 5
a(0000 0110) = 6
^
b(0000 0011) = 3
-----------------
=
a(0000 0101) = 5
步骤四: 输出a,b
的值
a = 5
b = 3
第四、左移运算符(<<
)
运算规则:
1. 左移可看作 ***整数M乘以2的N次方***
2. "<<"右边的数字就是N,左边的数字就表示这个整数M
注意:
移动的数字必须是整数
例如:
二进制移位:3 << 4
3(0000 0011)待移位的数字
6(0000 0110)左移第一位,左移一位之后,最右边的将会缺失,所以不足位数,补一位0,最左边将会多出一位,所以舍掉一位
12(0000 1100)左移第二位,最右边再补一位0,最左边再舍掉一位
24(0001 1000)左移第三位,最右边再补一位0,最左边再舍掉一位
48(0011 0000)左移第四位,最右边再补一位0,最左边再舍掉一位
乘法运算:3 << 4
= 3 * 2⁴
= 3 * 16
= 48
第五、右移运算符(>>
)
1. 右移可看作 ***整数M除以2的N次方***
2. "<<"右边的数字就是N,左边的数字就表示这个整数M
注意:
1. 移动的数字必须数整数
2. 右移之后的数字还是整数,不能得到浮点型数值,不能被2的N次方整数的数字,将会丢失精度,得到的结果只会保留整数部分,小数部分会被自动舍掉
例如:
二进制移位:8 >> 2
8(0000 1000)待右移的数字
4(0000 0100)右移第一位,最左边将会缺失一位,不足位数补一位0,最右边将会多出一位,所以舍掉最右边的一位
2(0000 0010)右移第二位,最左边再补一位0,最右边再舍掉一位
除法运算:8 >> 2
= 8 / 2²
= 8 / 4
= 2
第六、换位取反运算符(~
)
备注:
换位取反比较复杂,目前对于计算机存储负值的情况还不是很明确,这里从网络上找到一个获得取反的公式,这个公式我亲测过,得到的结果是正确的,这里不做过多的讲解,这块以后弄明白了之后再做补充
~a = -(a + 1)
运算规则:
1、遇到0时,结果为1
2、遇到1时,结果为0
参考:
换位取反运算符其他大咖的解读思路