您当前的位置: 首页 > 

王佳斌

暂无认证

  • 1浏览

    0关注

    821博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

js位运算符详解

王佳斌 发布时间:2019-06-29 16:34:06 ,浏览量:1

前言

平时的数值运算,其实是要先转换成二进制再进行运算的,而位运算就是直接进行二进制运算。 位运算是低级的运算操作,所以速度往往也是最快的(相对其它运算如加减乘除来说),并且借助位运算的特性还能实现一些算法。恰当地使用运算有很多好处。 前人用二进制、位运算给我们了一个操作简单的计算机,但我们却很少接触位运算了。 所有的位运算都是在二进制下来进行运算的,再二进制下只有0和1。

位运算符表

位运算分为两种,位逻辑运算符与位移运算符。 在这里插入图片描述在这里插入图片描述 位逻辑运算 - 逻辑结果参照表 在这里插入图片描述 位逻辑运算 - 结果参照表 在这里插入图片描述

位运算符基础

& 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0 | 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1 ^ 按位异或 若参加运算的两个二进制位值相同则为0,否则为1 ~ 取反 ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1 右移 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数, 高位补0

使用位运算

(1)~ 位求反 运算符规则是:将运算符后二进制数反转,0变1,1变 0,所以对一个数取反偶数次结果是它本身。

0000 0000 0000 0000 0000 0000 0000 0011     -> 3
1111 1111 1111 1111 1111 1111 1111 1100     -> ~ 3 = -4

常用场景: 求相反数: ~a + 1

(2) 6 > 右移 运算符规则是:各二进位全部右移若干位,正数高位补0,负数高位补1,低位丢弃。 例如: 12 >> 2 = 3

0000 0000 0000 0000 0000 0000 0000 1100     -> 12
0000 0000 0000 0000 0000 0000 0000 0011     -> 12 >> 2 = 3

因为12是正数,右移过程中高位补上两个0,低位丢弃,得出来的结果就是3。 例如:-12 >> 2 = -3

1111 1111 1111 1111 1111 1111 1111 0100    -> -12
1111 1111 1111 1111 1111 1111 1111 1101    -> -12 >> 2 = -3

因为-12是负数,右移过程中高位补上两个1,低位丢弃,得出来的结果就是-3。

常用场景: 右移常被用来做 / (2 ^ n)的运算,因为直接基于二进制运算,所以右移效率比 / (2 ^ n)高。

(4)>>>无符号右移 运算符规则是:各二进位全部右移若干位,高位补0,低位丢弃。 例如: 12 >>> 2 = 3

0000 0000 0000 0000 0000 0000 0000 1100     -> 12
0000 0000 0000 0000 0000 0000 0000 0011     -> 12 >>> 2 = 3

我们将12的二进位向右移动两位,高位补上两个0,低位丢弃,得出来的结果就是3。 例如:-12 >>> 2 = 1073741821

1111 1111 1111 1111 1111 1111 1111 0100    -> -12
0011 1111 1111 1111 1111 1111 1111 1101    -> -12 >> 2 = 1073741821

我们将-12的二进位向右移动两位,高位补上两个0,低位丢弃,得出来的结果就是1073741821。

(5)& 位与 运算符规则是:运算符两边有0,结果就为0 ,只有当两边同时为1是,结果才为1。 如下: 0 & 0 = 0; 0 & 1 = 0; 1 & 0 = 0; 1 & 1= 1; 例如:3&5

0000 0000 0000 0000 0000 0000 0000 0011     -> 3
0000 0000 0000 0000 0000 0000 0000 0101     -> 5
0000 0000 0000 0000 0000 0000 0000 0001     -> 3 & 5 = 1

位与运算的特殊用途: 一、清零(将一个单元与0进行位与运算结果为零) 二、取一个数指定位(例如取num=1010 1101的低四位 则将num&0xF得到0000 1101)。 三、判断奇偶性:用if ((a & 1) == 0) 代替 if (a % 2 == 0)来判断a是不是偶数。

(6)| 位或 运算规则就是 运算符两边有1,结果就为1 ,只有当两边同时为0是,结果才为0。 如下: 0 | 0 = 0; 0 | 1 = 1; 1 | 0 = 1; 1 | 1 = 1 ; 例如:3|5

0000 0000 0000 0000 0000 0000 0000 0011     -> 3
0000 0000 0000 0000 0000 0000 0000 0101     -> 5
0000 0000 0000 0000 0000 0000 0000 0111     -> 3 | 5 = 7

另,负数按补码形式参加按位或运算。

使用场景: 下面这个方法是摘自HashMap类,这个算法来修改用户使用构造器传进来的size的,这个算法是使用移位和或结合来实现的,性能上比循环判断要好。

public static final int tableSizeFor(int cap) {
    int n = cap - 1;
    n |= n >>> 1;
    n |= n >>> 2;
    n |= n >>> 4;
    n |= n >>> 8;
    n |= n >>> 16;
    return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}

(7)^ 位异或 运算规则是:当运算符两边相同位置都是相同,结果返回0,不相同时返回1。 例如:3 ^ 5 = 1

0000 0000 0000 0000 0000 0000 0000 0011     -> 3
0000 0000 0000 0000 0000 0000 0000 0101     -> 5
0000 0000 0000 0000 0000 0000 0000 0110     -> 3 ^ 5 = 6

通常我们交换两个数会使用一个临时变量来帮忙:

int t = a;
a = b;
b = t;

但是使用位运算,则不需要借助第三个变量。

a ^= b;
b ^= a;
a ^= b;

参照: B站视频教程 深入理解位运算符 位运算符 js中的位运算

关注
打赏
1665568777
查看更多评论
立即登录/注册

微信扫码登录

0.0426s