这都是位操作,其中:
~ : 意思是按位取反,类似于非(!)的关系,取它的反面。
<<: 意思是左移,移动二进制的位。
& : 意思是按位与,类似于与(&&)的关系,一假为假。
^ : 意思是按位异或,通俗地说就是相同为0,不同为1.
| : 意思是按位或,类似于或(||)的关系,一真为真。
优先级:按位取反 > 移位 > 按位与 > 按位异或 > 按位或
第一个式子:x | (1<<4) | (1<<3) | (1<<2),写出它们的二级制码:
1 :0 0 0 0 0 0 0 1
1<<2:0 0 0 0 0 1 0 0 ★★
1<<3:0 0 0 0 1 0 0 0 ★★
1<<4:0 0 0 1 0 0 0 0 ★★
(1<<4) | (1<<3) | (1<<2):0 0 0 1 1 1 0 0 ★★★
显然,拿(1<<2),(1<<3),(1<<4)与x求位或的结果就是将x二进制位中第3、4、5位(从低位向高位计数)中的数变为1。此操作多用来恢复位。
第二个式子:x & ~(1<<2) & ~(1<<0),写出它们的二级制码:
1 :0 0 0 0 0 0 0 1
1<<0 :0 0 0 0 0 0 0 1
~(1<<0):1 1 1 1 1 1 1 0 ★★
1<<2 :0 0 0 0 0 1 0 0
~(1<<2):1 1 1 1 1 0 1 1 ★★
~(1<<2) & ~(1<<0):1 1 1 1 1 0 1 0 ★★★
显然,这两个式子与x进行求位与的结果就是将x第1、3位处的二进制码变为0,此操作多用来清除位。
第二个式子:x ^ (1<<3) ^ (1<<2),写出它们的二级制码:
1 :0 0 0 0 0 0 0 1
1<<2:0 0 0 0 0 1 0 0 ★★
1<<3:0 0 0 0 1 0 0 0 ★★
(1<<3) ^ (1<<2):0 0 0 0 1 1 0 0 ★★★
显然,这两个式子与x进行求异或的结果就是将x第3、4位处的二进制码取反(0与1生成1,1与1生成0),其他位置不变。此操作多用来反转位和保留位。