浅谈二进制位移

一、基本形式

二进制位移操作是计算机编程中常用的一种位操作,它可以用来实现乘除操作、数据压缩和扩展等。位移操作包括左移和右移两种基本形式:

1、左移(Left Shift)

  • 符号:<<
  • 功能:将二进制数的所有位向左移动指定的位数,左边移出的位被丢弃,右边空出的位用0填充。
  • 效果:相当于将原数乘以 2n2n,其中 nn 是位移的位数。

2、右移(Right Shift)

  • 符号:>>(算术右移)或 >>>(逻辑右移)
  • 功能:将二进制数的所有位向右移动指定的位数,右边移出的位被丢弃,左边空出的位填充方式取决于是算术右移还是逻辑右移。
    • 算术右移:左边空出的位用原数的最高位(符号位)填充,适用于有符号整数。
    • 逻辑右移:左边空出的位用0填充,适用于无符号整数。
  • 效果:相当于将原数除以 2n2n,其中 nn 是位移的位数。

二、简单示例

#include <stdio.h>

int main() {
    int num = 5; // 二进制表示为 101
    int shift = 2;

    // 左移
    int leftShift = num << shift; // 将101左移2位,变为10100,即20
    printf("左移后的结果: %d\n", leftShift);

    // 算术右移
    int arithmeticRightShift = num >> shift; // 将101右移2位,变为00001,即1
    printf("算术右移后的结果: %d\n", arithmeticRightShift);

    // 逻辑右移
    unsigned int numUnsigned = 5; // 无符号整数
    unsigned int logicalRightShift = numUnsigned >>> shift; // 将101右移2位,变为00001,即1
    printf("逻辑右移后的结果: %u\n", logicalRightShift);

    return 0;
}

三、注意事项

  • 位移操作可能会导致溢出,尤其是右移操作,因为左移操作通常不会影响符号位。
  • 在不同的编程语言中,位移操作的具体实现可能有所不同,例如在某些语言中,右移操作可能默认就是算术右移。
  • 位移操作是位级别的操作,不涉及数值的数学运算,因此执行速度非常快。

猜你喜欢

转载自blog.csdn.net/a876106354/article/details/143461372