Skip to main content

C 语言位运算

十进制正整数位运算

对于 mm 位十进制正整数,如果希望获取第 nn(mn)(m \geq n ) 的数字,则有以下公式

d=(num10n1)%10d = (\frac{num}{10^{n-1}}) · \% 10

另外:个位数对 10 取模永远是 0。所以可以利用这一点,在获取一个数字的每一位数时作为终止条件。

二进制数位运算

  • & 与 两个位都为 1 时,结果才为 1
  • | 或 两个位都为 0 时,结果才为 0
  • ^ 异或 两个位相同为 0,相异为 1。也就是说,指示两位是否相异。
  • ~ 取反 0 变 1,1 变 0
  • << 左移 各二进位全部左移若干位,高位丢弃,低位补 0
  • >> 右移 各二进位全部右移若干位,对无符号数,高位补 0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补 0(逻辑右移)

获取二进制数位

要获取二进制数的每一位数字,可以使用位运算和位操作来实现。以下是几种常见的方法:

  1. 使用位掩码(Bit Mask)和按位与(Bitwise AND)操作: 通过创建一个与指定位对应的位掩码,然后使用按位与操作来提取该位的值。位掩码是一个只有指定位为 1,其他位为 0 的二进制数。例如,要获取二进制数的第 3 位(从右往左数),可以使用如下代码:

    unsigned int num  = 0b101010;  // 二进制数 101010
    unsigned int mask = 0b000100; // 位掩码,只有第 3 位为 1

    unsigned int bit = (num & mask) >> 2; // 获取第 3 位的值,在这里,对按位与的结果右移 n-1 位

    printf("第 3 位的值:%u\n", bit);

    在上述示例代码中,我们使用位掩码 0b100 和按位与操作 & 来提取二进制数 101010 的第 3 位的值。然后,通过右移 2 位将结果调整为最右边的位,以便打印出正确的值。

  2. 使用右移运算符(>>)和按位与(Bitwise AND)操作: 可以使用右移运算符将要获取的位移动到最右边,然后使用按位与操作提取该位的值。例如,要获取二进制数的第 5 位,可以使用如下代码:

    unsigned int num = 0b101010;  // 二进制数 101010

    unsigned int bit = (num >> 4) & 0b1; // 获取第 5 位的值

    printf("第 5 位的值:%u\n", bit);

    在上述示例代码中,我们首先使用右移运算符 >> 将二进制数 101010 的第 5 位移动到最右边,然后使用按位与操作 & 和位掩码 0b1 提取该位的值。

无论使用哪种方法,都可以根据需要获取二进制数的每一位数字。请根据具体情况选择适当的方法和操作符。