位运算

补码/反码

反码

反码就是每一位二进制数按位取反,即1变0,0变1

补码

在计算机中,负数表示为补码

即: -5 表示为 1000 0101 其中第一位1为负数符号,反之0为正数

补码的转化方法

正数的补码就是他的原码,相反同理

负数的原码转补码,令反码为x,补码为y,公式为以下

y=x+1y = x + 1

其反码就是按位取反,但是与下文的按位取反不是一个概念

负数的补码转原码,其方法是补码减去1后得到的二进制再按位取反回去

按位与/或

按位与

此前先了解与的真值表

ABO000010100111\begin{array}{cc|c} A&B&O\\ \hline 0&0&0\\ 0&1&0\\ 1&0&0\\ 1&1&1\\ \end{array}

所以按位与很简单

1
2
let i = 5
let and_number = 5 & 3 // 1

解析:5的二进制是0101,而3的二进制为0011,每一位取与,可以得到0001即1的二进制,同理 2 & 4,2的二进制是0010,4的二进制是0100,每一位去与,得到0000,即0的二进制,但是如果是 -5 & 6 怎么办,同理,-5用补码表示为1111 1011,6补码为 0000 0110,按位与的结果就是0000 0010,再补码转为原码为 0000 0010即2的二进制

按位或

转化原理与按位与同理

真值表如下:

ABO000011101111\begin{array}{cc|c} A&B&O\\ \hline 0&0&0\\ 0&1&1\\ 1&0&1\\ 1&1&1\\ \end{array}

按位异或

转化原理与按位与/或同理

其真值表:

ABO000011101110\begin{array}{cc|c} A&B&O\\ \hline 0&0&0\\ 0&1&1\\ 1&0&1\\ 1&1&0\\ \end{array}

按位取反

其心算公式为

!x=x1!x = -x - 1

1
2
let i = 4;
let not_number = !i // !4 = -4 - 1 = -5

解析:4是0000 0100,取反为1111 1011,在取反除了符号位为1000 0100,再+1为1000 0101即-5,其实是 原码 -> 补码 -> 取反 -> 补码 -> 原码 的过程,只不过是正数的补码就是原码所以第一步的原码转补码的过程就被省略了。

按位移动

1
2
let i = 5;
let move_number = i << 1 // 5 << 1 = 10

解析:5的二进制补码为0000 0101,后面的1则表示为移动偏移,以上的代码说明的是5按位向左偏移1个单位,即0000 1010,即10的二进制。如果当i为负数怎么办,现在我们取i为-5,向左移动1个单位。先把-5转为二进制即1000 0101,转化为补码为 1111 1011,左移为1111 0110 现在转为原码为 1000 1010 ,就是 -10的二进制。剩下右移同理。

本文作者:Frish2021

本文链接:https://coderfrish.github.io/2026/01/09/bitwise-calculation/

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

ESC 关闭 | 导航 | Enter 打开
输入关键词开始搜索