深入理解位运算符及其在JavaScript中的应用

  • 在我们之前的文章中,我们已经简单介绍了位运算在JavaScript中的应用,点击这里查看之前的文章
  • 本篇文章,我们将更深入地探讨位运算,帮助你更全面地理解它。

常见位运算符

运算符 描述 运算规则
& 按位与 and 两个对应的二进制位都为 1 时,结果为 1,否则为 0
| 按位或 or 两个对应的二进制位有一者为 1 时,结果为 1,否则为 0
^ 按位异或 XOR 两个对应的二进制位相异时,结果为 1,否则为 0
~ 按位取反 reverse 对原码进行取反运算,1 变为 0,0 变为 1
<< 左移 n 位 move left 将二进制位左移 n 位,,高位移出低位补 0
>> 有符号右移 n 位 move right 将二进制位右移 n 位,高位移出,低位补符号位
>>> 无符号右移 n 位 将二进制位右移 n 位,高位移出,低位补 0

& 与运算:

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
  • 总结:两位同时为1,结果才为1,否则结果为0。
  • 例如:3&5
    0000 0011
    0000 0101
  = 0000 0001
  • 因此 3&5 的值为 1。

  • 注意:负数按补码形式参加按位与运算。

  • 用途:

      1. 判断奇偶
    • 只要根据最未位是 0 还是 1 来决定,为 0 就是偶数,为 1 就是奇数。因此可以用 if ((i & 1) == 0)代替 if (i % 2 == 0)来判断 a 是不是偶数。
      1. 清零
    • 如果想将一个单元清零,即使其全部二进制位为 0,只要与一个各位都为零的数值相与,结果为零。
    function clearWithBitwiseAnd(number) {
        const zeroMask = 0; // 创建一个各位都是0的整数作为掩码
    
        const clearedNumber = number & zeroMask; // 使用位与操作将 number 清零
    
        return clearedNumber;
    }
    
    const originalNumber = 12345;
    const clearedNumber = clearWithBitwiseAnd(originalNumber);
    

| 或运算:

0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
  • 总结:参加运算的两个对象只要有一个为1,其值为1。
  • 例如:3&5
    0000 0011
    0000 0101
  = 0000 0111

parseInt(111, 2); // 7
  • 因此,3|5 的值为 7。
  • 注意:负数按补码形式参加按位或运算。

^ 异或运算

0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
  • 总结:参加运算的两个对象,如果两个相应位相同为0,相异为1。
    例如:3^5
    0000 0011
    0000 0101
  = 0000 0110

parseInt(110, 2); // 6
  • 因此,3^5 的值为 6。
  • 异或运算符的性质:
    • 交换律:(a^b)^c == a^(b^c)
    • 结合律:(a + b)^c == a^b + b^c
    • 对于任何数x,都有 x^x=0,x^0=x
    • 自反性: a^b^b=a^0=a

~ 取反运算

  • 对参数运算的数据按二进制进行 "取反" 操作。
~ 1 = 0
~ 0 = 1
  • 总结:对一个二进制数位按位取反,即0变1,1变0
  • 例如:~6
  0000 0110
= 1111 1001
  • 在计算机中,正数用原码表示,负数使用补码存储,首先看最高位,最高位1表示负数,0表示正数。
  • 当发现按位取反为负数时,就直接取其补码,变为十进制:
     0000 0110
   = 1111 1001
反码:1000 0110
补码:1000 0111

// 疑惑点:为什么补码后成为 1000 0111
`先求反码:原码的基础上,除最高位(符号位)外,其余位取反。
再求补码:反码的基础上,最低位加1。`
  • 因此,~6 的值为-7。

<< 左移运算

  • 定义:将一个运算对象的各二进制位左移若干位,左边的二进制位丢弃,右边补0
  • 例如:
a = 1010 1110
a = a << 2
a = 1011 1000

`00 舍弃` 1011 1000 = 1011 1000
  • 若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2

>> 右移运算

  • 定义:将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。
  • 例如:
a = 1010 1110
a = a >> 2
a = 0010 1011

0010 1011 `10 舍弃` = 0010 1011
  • 例如,a = a >> 2 将a的二进制位右移2位,左补0或者左补1的看被移数时正还是负
  • 操作数每右移一位,相当于该数除以2。

原码,补码,反码

  • 计算机中的有符号数有三种表示方法,即原码,补码,反码。这三种表示方法均有符号位和数值位两部分,符号位都是用 0 表示正,用 1 表示负,而数值位,三种表示方法各不相同。
  1. 原码:原码就是一个数的二进制数。
  • 例如:10 的原码为 0000 1010
// 获取方法
// num.toString(2)
  1. 反码:正数的反码与原码相同,如: 10 的反码为 0000 1010。负数的反码为除符号位,按位取反,即 0 变 1,1 变 0.
  • 例如:-10
原码:0000 1010
反码:1111 0101
  1. 补码:正数的补码与原码相同,如:10 的原码为 0000 1010。负数的补码是原码除符号位的所有位取反即 0 变 1,1 变 0,然后加 1 也就是反码加 1。
  • 例如:-10
原码:1000 1010
反码:1111 0101
补码:1111 0110

// 此时补码这里有点疑惑,详细过程就是:
// 1. 先从最右边的一位(最低位)开始相加,1(反码)加 1,结果是 2。在二进制中,2 表示为 10。所以,我们将该位写入 0,并在下一位(从右往左数的第二位)中进位 1。
// 2. 再来看第二位,0(反码)+ 1(进位) =1。
// 3. 其他位,因为没有进位,所以保持不变。
// 4. 所以,计算出 -10 的补码是 11110110

`先求反码:原码的基础上,除最高位(符号位)外,其余位取反。
再求补码:反码的基础上,最低位加1。`
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容

  • 很多高级语言的开发者都容易忽略位运算符的使用技巧,因为他们总感觉位运算符是底层开发的专利;其实,这是错误的,通过巧...
    科研者阅读 3,727评论 1 9
  • Java位运算符:Java的位运算符是把数字看作二进制来进行计算的。按位与(&):如果存在两个二进制位都为1,则该...
    但偏偏雨渐渐丶阅读 111评论 0 0
  • 在学习源码中,发现有大量使用位运算符,这样做的目的是为了节约内存开销和加快计算效率。 位运算符,这个"位"代表这什...
    杨杰C阅读 1,234评论 0 0
  • 1、概述 计算机中数在内存中以二进制形式进行存储位bit:计算机中处理数据的最小单位,其取值只能是0或1字节Byt...
    _百草_阅读 134评论 0 1
  • 原码 原码是电脑运算的名词,是指“未经更改”的码。为了便于ALU(算术逻辑单元)的设计,又发展出反码、补码等转换过...
    __RY__阅读 5,869评论 0 2