Leyanshi
Articles10
Tags6
Categories2

Categories

一言

Archive

C++ 笔记 2026-05-31

C++ 笔记 2026-05-31

Usage

C++ 可以直接操纵变量的内存,如A(char a = 'A';)的ASCII存储格式是01000001,反转(~a)是(01000001)。

  1. 反转,~a
  2. 按位与,a&b
  3. 按位或,a|b
  4. 按位异或,a^b相同为0,不同为1
  5. 向右移位,a>>b。比如 1000>>2 => 10
  6. 向左移位,a<<b

探测、置位、清位

  1. 探测
    检测右边第二位是不是1:
    1
    2
    unsigned char a = 'A';
    cout << (bool)(a&2); // 2=0000 0010,因为除了右2位其他都是0,而且这是与运算,所以a的其他位都会变成0。如果a有一位以上为1,那它转成bool就一定为true。答案是false。
  2. 设置
    设置右边第二位为1:
    1
    a = a | 2; // 2=0000 0010,因为右2是1,所以运算后一定是1,其他位如果是0,那么与2的其他0运算就是0,是1那么(因为是或)所以出来1。
  3. 清位
    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
2
3
4
5
6
7
8
int count(unsigned int x) {
int n = 0;
while (x) {
x &= (x - 1); // 消除最低位的 1
n++;
}
return n;
}

x & (x-1) 这个操作非常经典,可以记住:消除最低位的 1. 常用于:统计 1 的个数、判断一个数是否是 2 的幂(x & (x-1) == 0 且 x != 0)
##