位掩码的一些tip

位掩码的一些tip

我们把这三大位运算符(&|^)的核心秘密总结成一句话、一张表格和一组“大招”。

掌握了它们,你就掌握了 C 语言底层操作的灵魂。

1. 核心口诀(一句话记住)

  • &(按位与):全 1 才为 1 ——“用来裁剪和清零”

  • |(按位或):有 1 就为 1 ——“用来合并和置一”

  • ^(按位异或):不同才为 1 ——“用来翻转和对消”

2. 行为对照表(看透本质)

假设我们要对某个不知道的二进制位x进行操作:

运算符遇到 0 的效果遇到 1 的效果底层核心用途
&

强行变成 0

x & 0 == 0

保持原样

x & 1 == x

掩码裁剪:只留下想要的位,不想要的位全部抹黑(变成 0)。
|

保持原样

x | 0 == x

强行变成 1

x | 1 == 1

状态开启:把两组数据拼在一起,或者强行把某一位变成 1。
^

保持原样

x ^ 0 == x

强行取反 (0变1, 1变0)

x ^ 1 == ~x

开关翻转:无需用if-else,直接让某一位在 0 和 1 之间来回切换。

3. 三大运算符的“独门大招”

💡&的大招:判断奇偶

想知道一个变量n是奇数还是偶数,不用算n % 2(取余运算比较慢),直接看二进制的最后一位:

C

if ((n & 1) == 0) { // 奇数最后一位必然是1,偶数必然是0 // 是偶数 }

💡|的大招:多重开关合并(权限管理)

在很多系统里,用不同的位代表不同的权限。

  • 读权限:0001

  • 写权限:0010

  • 执行权限:0100

我想同时拥有“读”和“写”权限?直接用|合并:0001 | 0010 = 0011

💡^的大招:消消乐(找落单、不占内存交换变量)

  • 相同的数字异或直接归零:A ^ A = 0

  • 任何数和 0 异或还是它本身:A ^ 0 = A

  • 利用这个特性,可以在一个成双成对的数组里,用一轮循环直接揪出唯一那个落单的数字。

|