深入理解位运算

129 阅读3分钟

前言

在计算机中,位运算是一种强大而高效的工具,它通过直接操作二进制位来执行各种任务。位运算在计算机底层的算法、系统编程和嵌入式开发中扮演着重要的角色。

1. 二进制

在开始位运算之前,我们需要了解二进制数制。计算机以二进制形式存储和处理信息,以 0 和 1 来表示实际生活中的数字,字符,图像等信息。例如,十进制数10在二进制中表示为1010。每个二进制位代表不同权重的2的幂,从右向左递增。

2. 位运算基础操作

按位与(&)

将两个数字的的二进制的每一位进行&操作, 如果两个位都为 1,那么结果为 1,否则为 0

const num1 = 5; //101
const num2 = 6; //110

let res = num1 & num2; // 100
console.log(res);//4

以下是按位与运算的常见运用常见

//判断一个数是不是2的次幂数
function test(num) {
  if (num <= 0) {
    return false;
  }
  return (num & (num - 1)) === 0;
}
console.log(test(16));

上面的代码中通过判断num(num-1) 进行& 运算 如果num是2的次幂数,则num的二进制为1 000xxxxx为后面的0,(num-1)的二进制为0111xxxxx为后面的1,例如16的二进制为10000,15的二进制为01111

按位或(|)

将两个数字的的二进制的每一位进行 |操作, 如果两个位至少有一个位为 1,那么结果为 1,否则为 0

const num1 = 5; //101
const num2 = 3; // 011

const result = num1 | num2; // 111

console.log(result);

按位异或(^)

将两个数字的的二进制的每一位进行 ^操作, 如果两个位的二进制值相同,那么结果为 0,否则为 1

let num1 = 5; // 101
let num2 = 7; // 111
//交换num1和num2,通过按位异或实现
function swap(a, b) {
  a = a ^ b; // a = 101 ^ 111 = 010  //2
  b = a ^ b; // b = 010 ^ 111 = 101  //5
  a = a ^ b; // a = 010 ^ 101 = 111  //7
  return [a, b];
}

[num1, num2] = swap(num1, num2);
console.log(num1, num2); //7,5

按位非(~)

将一个数字的二进制的每一位进行取反操作, 即 0 变成 1, 1 变成 0,将取得的值转成 32 位的有符号整数型

const num1 = 5 // 00000000000000000000000000000 101

let res = ~num1 //

console.log(~num1);//-6

左移右移运算

将一个数字的二进制的位向左或向右移动 n 位, 其中 n 为一个非负整数,如果 n 大于 32 位,那么结果为 0

1.左移运算(<<)

左移运算将一个二进制数的所有位向左移动指定的位数。左移相当于将二进制数乘以2的n次幂。例如:

const num = 5;  //101

console.log(num << 1);  // 1010

2. 右移运算(>>)

右移运算将一个二进制数的所有位向右移动指定的位数。右移相当于将二进制数除以2的n次幂并取整。例如:

const num = 5; //101

console.log(num >> 1); //10