位运算详细介绍

1.定义: 

位运算是一种针对二进制数的操作,它直接操作二进制数的各个位,以达到高效的运算目的。位运算常用于计算机底层的操作,如编码解码、图像处理和密码学等领域。下面详细介绍几种常见的位运算及其应用。


位与(&):对两个操作数的每个对应位执行逻辑与操作,如果两个对应位都为1,则结果为1,否则为0。
例子:假设有两个二进制数10101001和11001100,进行位与运算后,结果为10001000。


位或(|):对两个操作数的每个对应位执行逻辑或操作,如果两个对应位中至少有一个为1,则结果为1,否则为0。
例子:假设有两个二进制数10101001和11001100,进行位或运算后,结果为11101101。


位异或(^):对两个操作数的每个对应位执行逻辑异或操作,如果两个对应位不相同,则结果为1,否则为0。
例子:假设有两个二进制数10101001和11001100,进行位异或运算后,结果为01100101。


位非(~):对操作数的每个位执行逻辑非操作,即对每个位取反。
例子:假设有一个二进制数10101001,进行位非运算后,结果为01010110。


左移(<<):将一个二进制数的各个位向左移动指定的位数,右侧空出的位用0填充。
例子:假设有一个二进制数10101001,进行左移2位运算后,结果为10100100。


右移(>>):将一个二进制数的各个位向右移动指定的位数,左侧空出的位用符号位填充(正数用0,负数用1)。
例子:假设有一个二进制数10101001,进行右移2位运算后,结果为11101010。

 

2.运用场景: 


判断奇偶性:通过位与运算和位移运算,可以判断一个整数是奇数还是偶数。如果一个整数的最后一位为1,则为奇数,否则为偶数。


交换两个变量的值:通过位异或运算,可以实现两个变量值的交换,而无需使用额外的中间变量。


判断一个数是否是2的幂次方:如果一个数n是2的幂次方,那么它的二进制表示中只有一个1,通过位与运算可以判断。


判断两个数是否异号:通过位异或运算,如果两个数的符号位不同,则结果为1,表示两个数异号。


去除一个整数的最后一位:通过右移运算,可以将一个整数的最后一位去除。


判断一个数的第n位是0还是1:通过右移运算和位与运算,可以得到一个数的任意一位的值。


以上只是位运算的一部分应用,位运算在计算机底层的操作中有着广泛的应用,能够高效地进行各种操作,提高程序的性能。

3.示例代码分析 

示例1:

for (int i=0; i<8; i++) {
            if(byte & 1) count++;
            byte >>= 1;
        }

 这段代码的作用是计算一个字节(byte)中为1的位数(即二进制表示中1的个数)。
首先,通过一个循环,从低位到高位逐个检查字节的每个位。循环的条件是i<8,即检查字节的8个位。
在循环中,使用位与运算(&)将字节的最低位与1进行比较。如果最低位为1,则位与运算的结果为1,否则为0。通过这个判断条件,可以判断字节的最低位是否为1。
如果最低位为1,则将计数器(count)加1,用于统计字节中为1的位数。
接下来,通过右移运算(>>)将字节向右移动1位,即将字节的次低位移动到最低位。这样,在下一次循环中,可以继续检查字节的下一个位。

循环结束后,计数器中的值即为字节中为1的位数。
这段代码可以用于统计一个字节中为1的位数,可以应用于各种场景,如计算机网络中的数据包处理、图像处理中的像素计数等。

问题:右移时,高位是否自动补零 

在这段代码中,默认情况下,byte是一个有符号整数(signed char, int8_t等),因此在右移运算时,高位会使用符号位进行补位。这意味着如果byte的最高位(符号位)为1,则右移后,高位将被填充为1;如果byte的最高位为0,则右移后,高位将被填充为0。

如果希望在右移时,高位补0,可以将byte声明为无符号整数(unsigned char, uint8_t等),这样右移操作将会在高位补0。

示例2: 

if (count & 1) { //偶校验
        pack[7] = 1;
    } else {
        pack[7] = 0;
    }

 在代码中,count & 1用于判断一个数的奇偶性。在二进制表示中,偶数的最低位(最右边的位)一定是0,而奇数的最低位一定是1。因此,当一个数与1进行按位与操作时,如果这个数是奇数,则结果为1;如果是偶数,则结果为0。

因此,通过count & 1可以方便地判断一个数是奇数还是偶数。

  • 40
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值