位掩码的一些tip
我们把这三大位运算符(&、|、^)的核心秘密总结成一句话、一张表格和一组“大招”。
掌握了它们,你就掌握了 C 语言底层操作的灵魂。
1. 核心口诀(一句话记住)
&(按位与):全 1 才为 1 ——“用来裁剪和清零”。|(按位或):有 1 就为 1 ——“用来合并和置一”。^(按位异或):不同才为 1 ——“用来翻转和对消”。
2. 行为对照表(看透本质)
假设我们要对某个不知道的二进制位x进行操作:
| 运算符 | 遇到 0 的效果 | 遇到 1 的效果 | 底层核心用途 |
& | 强行变成 0
| 保持原样
| 掩码裁剪:只留下想要的位,不想要的位全部抹黑(变成 0)。 |
| | 保持原样
| 强行变成 1
| 状态开启:把两组数据拼在一起,或者强行把某一位变成 1。 |
^ | 保持原样
| 强行取反 (0变1, 1变0)
| 开关翻转:无需用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。利用这个特性,可以在一个成双成对的数组里,用一轮循环直接揪出唯一那个落单的数字。
|
