1. 位运算&

我们之前说过,所有数据都以二进制表示形式存储在内存中。所以很久以前,程序员想出了很多有趣的方法来处理二进制数。例如,Java 具有对数字二进制表示的位进行运算的逻辑运算符:&(AND)、, | (OR)( ~NOT 或补码) 和^(XOR - 异或)。

a & b
按位&(AND)运算符

此运算符与逻辑&(AND) 运算符非常相似,只是它由一个符号表示,而不是两个:

并将其应用于各个位。每个操作数都被视为一个位数组,i结果的第 th 位是使用i两个操作数中每一个的第 th 位计算的。

结果的第一位将根据数字的第一位a 和数字的第一位计算b,第二位——根据数字的第二位a 和数字的第二位b,等等。

( &AND) 运算符的意思是“只有当数字的相应位等于一时,结果位才a等于一AND数字的相应位b等于一”:

1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0

例子:

例子 结果
0b0011 & 0b1010
0b0010
0b1111 & 0b0000
0b0000
0b1010 & 0b0101
0b0000
0b1111 & 0b1010
0b1010

2. 位运算|

此运算符与逻辑|(OR) 运算符非常相似,只是它由一条垂直线表示,而不是两条:

a | b

并将其应用于各个位。每个操作数都被视为一个位数组,结果的第 i 位是使用两个操作数中每一个的第 i 位计算的。

按位|(OR) 运算符表示“如果数字的相应位等于 1,则结果位a等于 1,OR则数字的相应位b等于 1”:

1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0

例子:

例子 结果
0b0011 | 0b1010
0b1011
0b1110 | 0b0000
0b1110
0b1010 | 0b0101
0b1111
0b1111 | 0b1010
0b1111

只有当两个数的对应位(相同位置的位)都为零时,结果对应的位才为零。



3. 按位^(异或或“异或”)运算符

运算XOR符,也发音为exclusive or,由符号表示^。要在键盘上输入它,请按shift + 6(在英文键盘布局上)。

a ^ b

该运算符与 运算符有些相似OR,包括名称相似:XOR

按位^(XOR) 运算符表示“如果数字的相应位等于 1,则结果位a等于 1OR数字的相应位b等于 1,但不能同时等于 1”:

1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0

例子:

例子 结果
0b0011 ^ 0b1010
0b1001
0b1110 ^ 0b0000
0b1110
0b1010 ^ 0b0101
0b1111
0b1111 ^ 0b1010
0b0101

只有当两个数对应的位(相同位置的位)不同时,结果对应的位才等于1。如果位相同则结果位等于零



4.按位~(非,补)运算符

我想你已经猜到它的作用了。此运算符与逻辑 (NOT) 运算符非常相似,但它由波浪号而不是感叹号!表示:

~a

这是一个一元运算符,这意味着它适用于单个数字,而不是两个。它出现在这个单一操作数之前。

按位运算符表示“如果数字的相应位为零,~则结果位为一,如果数字的相应位为一,则结果位为零”:aa

~1 = 0
~0 = 1

例子:

例子 结果
~0b0011
0b1100
~0b0000
0b1111
~0b0101
0b1010
~0b1111
0b0000

1这个运算符只是简单地改变了到的位0和到的01