进制与运算符

计算机并不能像人类一样理解文字或图片,在最底层,它只知道一种状态:通电(On)或断电(Off)。这个最小的单位被称为 Bit(比特/位)。就像一个开关:

  • 1=开/高电平/真(True)

  • 0=关/低电平/假(False)

一个 Bit 能表示的信息太少了(只有2种可能)。为了存储更复杂的数据,计算机将8个Bit组合在一起,称为Byte(字节)。一个字节可以表示 28=256 种不同的状态(0-255).

常用存储单位换算(基于二进制)

单位
符号
换算关系

字节

B

1 B = 8 bit

千字节

KB

1 KB = 1024 B

兆字节

MB

1 MB = 1024 KB = 220 B ≈ 1048576 B

吉字节

GB

1 GB = 1024 MB = 230 B

太字节

TB

1 TB = 1024 GB = 240 B

拍字节

PB

1 PB = 1024 TB = 250 B

注意

在某些场景(如硬盘厂商宣传)中,1 KB = 1000 B(十进制),但操作系统通常按 1024(二进制)计算,因此实际可用容量略小于标称值。

原码、反码、补码

在计算机中,为了表示有符号整数(即正数和负数),通常使用三种编码方式:原码、反码和补码来表示,它们用于简化计算机中数字的算术运算,尤其是二进制数的加减运算。

  • 原码:最高位为符号位(0表示正,1表示负),其余位表示数值的绝对值。

  • 反码:正数的反码等于原码,负数的反码等于符号位不变,其余各位取反(0变1,1变0)

  • 补码:正数的补码等于原码,负数的补码等于反码+1

Drawing

与运算符(&)

整形数据在内存中存放的是二进制的补码,所以整形数据的运算即是二进制补码的运算,按位与运算。

Drawing

按位与的主要用途就是清零(即把1置为0),若要将原数种为1的位置置为0。上面的例子,要将89二进制中的1置为0,我们需要找一个89二进制位中1的对应位置是0的数(38)与其相与。

或运算符(|)

按位或 | 运算符是双目运算符,参数运算的两个数各位相“或”,只要其中有一个二进制位值为1,结果就为真。

Drawing

如果要将一个数的某几位置为1,只需要与这几位二进制序列是1的数进行或操作即可。上面示例中,75与63(或6为都为1)相与,其结果后六位都为1。要使其后n位变为1,需要与2^-1按位或即可。

异或运算符(^)

按位异或“^”是双目运算符,参与运算的两个数对应的二进制位相异或,当对应的两个二进制位相异时,结果为1,否则结果为0;

Drawing

从上面的例子我们可以看出异或操作可以使一个二进制序列特定位翻转(0变1,1变0)

若要使一个数的二进制序列的后 n 位翻转,只需要将这个数与后 n 位全是 1 的数相异或即可。

取反运算符(~)

取反运算符为单目运算符,具有右结合性,取反运算符是对参与运算的数的二进制位按位取反,即0变1,1变0(包括符号位),

Drawing

左移运算符(<<)

左移运算符是双目运算符,作用是将 << 左边运算数的各二进制位全部左移若干位,由 << 右边的数指定其移动的位数,左移过程中高位丢弃,低位补 0;

Drawing

整数在计算机中存放的是其补码,但求值是我们需要将其转换为原码。负数的补码 = 原码取反 + 1,符号位不变。补码转换为原码=补码 - 1 取反。

实际上,左移一位相当于该数乘以2,将一个数左移两位相当于该数乘以4,这种情况仅限于移出位不含1的情况。

右移运算符(>>)

右移运算符是双目运算符,作用是把 >> 左边的运算数的各二进制位全部右移若干位,由 << 右边的数指定其移动的位数。

Drawing

在进行右移动时对于有符号数要注意符号位的问题,当位正数时,最高位补0;当为负数时,最高位补0还是补1,取决于编译系统的规定。补0的称为逻辑右移,补1的称为算数右移。

进制转换

  • 二进制(Binary),以 0b0B 开头

  • 八进制(Octal)以 0o0O 开头

  • 十六进制(Hexadecimal)——以 0x0X 开头

JavaScript 中所有数字本质上都是 十进制浮点数(IEEE 754),但可以通过以下方法在字符串形式上实现进制转换。

十进制---->其他进制:使用.toString(radix)

其他进制字符串 → 十进制:使用 parseInt(string, radix)

parseInt 只会自动识别 0x/0X 为十六进制,对 0b0o 不识别

✅ 正确做法:去掉前缀 + 指定基数

或者用 Number()(它能识别所有 ES6 前缀):

使用工具函数:将任意进制字符串转十进制(支持 0b/0o/0x)

参考文章

八、

大端与小端(Endianness)

  • 大端(Big Endian):高位字节在低地址,数据在内存中的顺序与人类阅读顺序一致。

  • 小端(Little Endian):低位字节在低地址,更符合低位优先的机器处理方式。

大端的优势:

  • 更直观,易于人类理解。

  • 多字节数值按从高到低排列(像书写顺序)

  • 网络协议规定为大端(网络字节序)

小端的优势:

  • 计算机运算效率高(低位先处理)

  • 取某个低位值是无需移位。

  • 适合大部分 CPU 指令优化。

内存与十六进制

Drawing

最后更新于

这有帮助吗?