Javascript 位运算符

本文深入解析JavaScript中的位运算符,包括AND、OR、XOR、NOT、零填充左位移、有符号右位移和零填充右位移的运作原理及实例。探讨了JavaScript如何处理32位有符号整数进行位运算,以及二进制数的原码、反码、补码概念。

Javascript 位运算符

运算符名称描述
&AND如果两位都是1,则设置每位为1
|OR如果两位之一为1,则设置每位为1
^XOR如果两位只有一位为1.则设置每位为1
~NOT反转所有位
<<零填充左位移通过从右推入 0 ,使最左边位脱落
>>有符号右位移通过从左推入最左位的拷贝来向右位移,使最右边位脱落
>>>零填充右位移通过从左推入来向右位移,是最右位脱落
&
实例:
5&1    -----       00000101 & 00000001
1      -----       00000001
==========================================
|         
实例:
5|1    ------      00000101 | 00000001
5      ------      00000101
==========================================
^         
实例:
5^1    ------      00000101 ^ 00000001
4      ------      00000100
==========================================
~ (反转所有位)
实例:
~5    ------       ~00000101
-6    ------        11111010
==========================================
JavaScript 使用 32 位按位运算数

~5 ~0101 = 1010 = -10
JavaScript 将数字存储为 64 位浮点数,但所有按位运算都以 32 位二进制数执行。
在执行位运算之前,JavaScript 将数字转换为 32 位有符号整数。
执行按位操作后,结果将转换回 64 位 JavaScript 数。
上面的例子使用 4 位无符号二进制数。所以 ~ 5 返回 10。
由于 JavaScript 使用 32 位有符号整数,JavaScript 将返回 -6。
00000000000000000000000000000101 (5)
11111111111111111111111111111010 (~5 = -6)
有符号整数使用最左边的位作为减号。

这里要说一下关于 二进制 的一些概念:

二进制以最左边一位决定正负即:0为正 , 1为负
二进制的原码:当前数取绝对值转二进制 (负数需要符号位转1)
二进制的反码:正数:反码与原码相同,负数:当前二进制数符号位不变其余位取反即:0换成1 1换成0
二进制的补码:正数:补码与原码相同,负数:将当前二进制数的反码加1 即:

例:
5 的原码   00000000  00000000  00000000  00000101
5 的反码   00000000  00000000  00000000  00000101
5 的补码   00000000  00000000  00000000  00000101
-5 的原码  先取绝对值为 5 然后符号位+1为:
		  10000000  00000000  00000000  00000101
-5 的反码  符号位不变其余位置取反
		  11111111  11111111  11111111  11111010
-5 的补码  反码 +1
		  11111111  11111111  11111111  11111011

二进制转十进制
例 5的二进制数是 00000000 00000000 00000000 00000101
从右开始 20 * 1 + 21 * 0 + 22 * 1 = 5
十进制转二进制
例 10 转二进制数 00000000 00000000 00000000 00001010
从右开始 20 * 0 + 21 * 1 + 22 * 0 + 23 * 1 = 10
-10 转二进制数
先取绝对值得二进制数 00000000 00000000 00000000 00001010
再给其取反 11111111 11111111 11111111 11111010
再加1 11111111 11111111 11111111 11111011
相当于负数原码的补码

归纳

  1. 正数的原码,反码补码都相同
  2. 负数的反码为该数的原码除符号位取反,负数的补码为该数的反码加1
  3. 负数的二进制数即为负数的补码
  4. 符号位为1的二进制数转十进制数就是 十进制负数转二进制的逆运算(除符号位外-1,除符号位外取反,得到的结果转十进制)
注意哦

二进制转十进制要先补全位数哦,看符号位是0还是1 ,在判断怎么转换,直接转会出错哦

参考

W3CSchool
负数与二进制的转换

### JavaScript 中的位运算符 #### 与(`&`) 与运算符会对两个操作数的每一执行按与操作。只有当两都为 `1` 时,结果才为 `1`。 ```javascript let a = 5; // 0101 in binary let b = 3; // 0011 in binary console.log(a & b); // Output: 1 (0001 in binary)[^1] ``` #### 或(`|`) 或运算符会对两个操作数的每一执行按或操作。只要有一为 `1`,结果就为 `1`。 ```javascript let c = 5; // 0101 in binary let d = 3; // 0011 in binary console.log(c | d); // Output: 7 (0111 in binary)[^1] ``` #### 异或(`^`) 异或运算符会对两个操作数的每一执行按异或操作。如果相应不同,则结果为 `1`;相同则为 `0`。 ```javascript let e = 5; // 0101 in binary let f = 3; // 0011 in binary console.log(e ^ f); // Output: 6 (0110 in binary)[^1] ``` #### 非(`~`) 非位运算符会将操作数的每一取反。即把 `0` 变成 `1`,把 `1` 变成 `0`。 ```javascript let g = 5; // 0101 in binary console.log(~g); // Output: -6 (-0110 in two's complement form)[^3] ``` #### 左移(`<<`) 左移运算符会将其左侧的操作数向左移动指定数量的置,并在右侧填充零。 ```javascript let h = 5; // 0101 in binary console.log(h << 1); // Output: 10 (1010 in binary) ``` #### 右移(`>>`) 右移运算符会将其左侧的操作数向右移动指定数量的置。对于正数,在左边填充零;对于负数,在左边填充一。 ```javascript let i = 8; // 1000 in binary console.log(i >> 2); // Output: 2 (0010 in binary) ``` #### 无符号右移(`>>>`) 无符号右移运算符会将其左侧的操作数向右移动指定数量的置,并始终在左边填充零。 ```javascript let j = -8; // In two's complement form, this is represented as all ones followed by zeros. console.log(j >>> 2); // Output will depend on the system architecture but typically results in a large positive number due to sign extension being ignored. ``` 这些位运算符可以应用于各种场景,比如优化性能敏感的应用程序、处理低级别的数据结构或是实现特定算法等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值