C 语言位运算
十进制正整数位运算
对于 位十进制正整数,如果希望获取第 位 的数字,则有以下公式
另外:个位数对 10 取模永远是 0。所以可以利用这一点,在获取一个数字的每一位数时作为终止条件。
二进制数位运算
- & 与 两个位都为 1 时,结果才为 1
- | 或 两个位都为 0 时,结果才为 0
- ^ 异或 两个位相同为 0,相异为 1。也就是说,指示两位是否相异。
- ~ 取反 0 变 1,1 变 0
- << 左移 各二进位全部左移若干位,高位丢弃,低位补 0
- >> 右移 各二进位全部右移若干位,对无符号数,高位补 0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补 0(逻辑右移)
获取二进制数位
要获取二进制数的每一位数字,可以使用位运算和位操作来实现。以下是几种常见的方法:
-
使用位掩码(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 位将结果调整为最右边的位,以便打印出正确的值。 -
使用右移运算符(>>)和按位与(Bitwise AND)操作: 可以使用右移运算符将要获取的位移动到最右边,然后使用按位与操作提取该位的值。例如,要获取二进制数的第 5 位,可以使用如下代码:
unsigned int num = 0b101010; // 二进制数 101010
unsigned int bit = (num >> 4) & 0b1; // 获取第 5 位的值
printf("第 5 位的值:%u\n", bit);在上述示例代码中,我们首先使用右移运算符
>>
将二进制数101010
的第 5 位移动到最右边,然后使用按位与操作&
和位掩码0b1
提取该位的值。
无论使用哪种方法,都可以根据需要获取二进制数的每一位数字。请根据具体情况选择适当的方法和操作符。