C++ 笔记 2026-05-31
Usage
C++ 可以直接操纵变量的内存,如A(char a = 'A';)的ASCII存储格式是01000001,反转(~a)是(01000001)。
- 反转,
~a - 按位与,
a&b - 按位或,
a|b - 按位异或,
a^b,相同为0,不同为1 - 向右移位,
a>>b。比如1000>>2=>10 - 向左移位,
a<<b
探测、置位、清位
- 探测
检测右边第二位是不是1:1
2unsigned char a = 'A';
cout << (bool)(a&2); // 2=0000 0010,因为除了右2位其他都是0,而且这是与运算,所以a的其他位都会变成0。如果a有一位以上为1,那它转成bool就一定为true。答案是false。 - 设置
设置右边第二位为1:1
a = a | 2; // 2=0000 0010,因为右2是1,所以运算后一定是1,其他位如果是0,那么与2的其他0运算就是0,是1那么(因为是或)所以出来1。 - 清位
1
a = a & ~2; // ~2=1111 1101,或的时候,右2位因为~2的是0,所以必是0,a的其他位如果是1,那么与~2的1运算就是1不变,如果是0那么与1运算,因为有0所以结果不变,综上所述,除了右2清零其他不变。
其他
a^b^b==a
习题
求整数中的二进制表示中1的个数(Brian Kernighan算法)
1 | |
x & (x-1) 这个操作非常经典,可以记住:消除最低位的 1. 常用于:统计 1 的个数、判断一个数是否是 2 的幂(x & (x-1) == 0 且 x != 0)
##
