• 位运算详细介绍


    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:

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

     这段代码的作用是计算一个字节(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: 

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

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

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

  • 相关阅读:
    【华为机试真题 JAVA】小朋友排队-100
    人工智能在电气中的应用,电力电子与人工智能
    SpringMVC概述与简单使用
    千帆竞发-Redis分布式锁
    Java泛型漫谈
    Nvm任意切换node版本号
    java入门-JDK下载与安装
    LeetCode 39. Combination Sum【回溯,剪枝】中等
    揭秘华为云GaussDB(for Influx):数据直方图
    What is Fan-out
  • 原文地址:https://blog.csdn.net/qq_71286244/article/details/139463160