JavaScript 中的位运算符

&:按位与运算符,将两个数的二进制的每一位进行与操作,只有两个数对应位都为 1 时结果位才为 1

|:按位或运算符,将两个数的二进制的每一位进行或操作,只要两个数对应位中有一个为 1 时结果位就为 1

^:按位异或运算符,将两个数的二进制的每一位进行异或操作,如果两个数对应位不同则结果位为 1,相同则为 0

~:非运算符,反转所有位,包括符号位

<<:通过从右推入零向左位移,并使最左边的位脱落

>>:通过从左推入最左位的拷贝来向右位移,并使最右边的位脱落, 是带符号右移,它将数字的二进制表示向右移动,并用符号位填充空出来的位。如果原来是正数,则在左边补0,如果原来是负数,则在左边补1

>>>: 通过从左推入零来向右位移,并使最右边的位脱落,是无符号右移,它也将数字的二进制表示向右移动,但是无论原来是正数还是负数,都在左边补0

这些位运算符可以用于处理数字的二进制位,进行位级别的操作。

// 按位与运算符 &
const result1 = 5 & 3; // 0101 & 0011 = 0001
// 结果为 1

// 按位或运算符 |
const result2 = 5 | 3; // 0101 | 0011 = 0111
// 结果为 7

// 按位异或运算符 ^
const result3 = 5 ^ 3; // 0101 ^ 0011 = 0110
// 结果为 6

// 右移运算符 >>
const result4 = 8 >> 2; // 1000 >> 2 = 0010
// 结果为 2

// 左移运算符 <<
const result5 = 1 << 3; // 0001 << 3 = 1000
// 结果为 8

// 
const num = 5; // 二进制为 0101

const bitwiseNotResult = ~num;
// ~0101 = 1010 (取反后的结果)

console.log(bitwiseNotResult); // 输出 -6

上面的操作,就是先转换成 2 进制进行位运算,然后计算完成再转换成计算前的进制

举例说明-10 带符号右移2 位和无符号右移2 位

const a = -10;

const result1 = a >> 2; // 带符号右移
const result2 = a >>> 2; // 无符号右移

console.log(result1); // 输出: -3
console.log(result2); // 输出: 1073741821

------------------------------------------------------------

  
// 在计算机中,负数通常使用二进制补码表示。负数的二进制补码表示是通过将该数的绝对值转换为二进制形式,然后取其补码(即取反加一)来表示负数。

对于 -10 的二进制表示为 11111111111111111111111111110110 的原因如下:

首先,将 10 的二进制表示为 
        0000 0000 0000 0000 0000 0000 0000 1010(32位补齐的形式)。
然后,取其补码,即将每位取反再加1:
取反得到 1111 1111 1111 1111 1111 1111 1111 0101
加1得到  1111 1111 1111 1111 1111 1111 1111 0110
因此,-10 的二进制补码表示为 
        1111 1111 1111 1111 1111 1111 1111 0110

-------------------------------------------------------------

1111 1111 1111 1111 1111 1111 1111 0110 此时右移2位
// 如果原来是正数,则在左边补0,如果原来是负数,则在左边补1, 因为是-10,所以左侧补 1

1111 1111 1111 1111 1111 1111 1111 1101

---------------------------------------
取反
0000 0000 0000 0000 0000 0000 0000 0010
转化成 10 进制 为-2
再-1
-2-1 = -3

=================================================================
无符号右移2 位
1111 1111 1111 1111 1111 1111 1111 0110 此时右移2位
// 都在左边补0

0011 1111 1111 1111 1111 1111 1111 1101 =》转换成 10 进制就是1073741821

补码:将每位取反再加1

为啥是32位补齐的形式:

        对于补码表示的负数,计算机通常使用补码形式来表示,其中补码是通过对原码进行一定的转换得到的。对于32位的补码表示,通常需要将原码的每一位都取反,然后再加上一个1

        在计算机中,整数类型的大小通常是32位或64位,因此为了确保补码表示的数字能够完全表示,需要将原码补齐到相应的位数。对于负数来说,通常需要补齐到32位或64位,以确保能够正确表示负数的补码

其中的一个运算的应用:

const i = c & 0xffff ,其中 c 为 一个未知变量,这个运算代表什么含义

在这个表达式中,c & 0xffff 表示对变量 c 的值进行按位与(AND)操作,与 0xffff 进行按位与操作可以提取 c 的低 16 位(即低位字节)。

0xffff 是一个16位二进制数,二进制表示为 1111111111111111,对应16进制表示为 0xffff。

通过将 c 与 0xffff 进行按位与操作,可以保留 c 的低 16 位,将高位清零。

这种操作通常用于数据处理中,可以用来提取或保留数据的特定位,或者清零高位数据

举例说明保留低 16 位,清零高 16 位:

假设有一个变量 c 的值为 0xABCD1234,我们可以通过按位与操作 c & 0xffff 来保留 c 的低 16 位并清零高 16 位。

const c = 0xABCD1234; // 假设 c 的值为 0xABCD1234

const i = c & 0xffff; // 保留 c 的低 16 位,清零高 16 位

console.log(i.toString(16)); // 输出: 1234

1010 1011 1100 1101 0001 0010 0011 0100
0000 0000 0000 0000 1111 1111 1111 1111
---------------------------------------

与运算就是只有两个数对应位都为 1 时结果位才为 1,那上面的值就为
0000 0000 0000 0000 0001 0010 0011 0100 

转换成 16 进制就是0x1234 , 所以const i = c & 0xffff , 保留 c 的低 16 位,清零高 16 位

  • 20
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值