摘要:二进制或运算符符号为,表示若两个二进制位都为,则结果为,否则为。上面代码对三个变量进行二进制或运算,得到掩码值为二进制的。有了掩码,二进制或运算可以确保打开指定的开关。二进制与运算可以将当前设置中凡是与开关设置不一样的项,全部关闭。
概述
作用速度块
都作用于32位整数
二进制位运算符用于直接对二进制位进行计算,一共有7个。
二进制或运算符(or):符号为|,表示若两个二进制位都为0,则结果为0,否则为1。
二进制与运算符(and):符号为&,表示若两个二进制位都为1,则结果为1,否则为0。
二进制否运算符(not):符号为~,表示对一个二进制位取反。
异或运算符(xor):符号为^,表示若两个二进制位不相同,则结果为1,否则为0。
左移运算符(left shift):符号为<<,详见下文解释。
右移运算符(right shift):符号为>>,详见下文解释。
头部补零的右移运算符(zero filled right shift):符号为>>>
做位运算的时候,是以32位带符号的整数进行运算的,并且返回值也是一个32位带符号的整数
利用这个特性,可以写出一个函数,将任意数值转为32位整数。
function toInt32(x) {
return x | 0;
}
toInt32(1.001) // 1
toInt32(1.999) // 1
toInt32(1) // 1
toInt32(-1) // -1
toInt32(Math.pow(2, 32) + 1) // 1
toInt32(Math.pow(2, 32) - 1) // -1
二进制或运算符
两个二进制位之中只要有一个为1,就返回1,否则返回0。
0 | 3 // 3
二进制与运算符
两个二进制位之中只要有一个位为0,就返回0,否则返回1。
0 & 3 // 0
二进制否运算符
二进制否运算符(~)将每个二进制位都变为相反值(0变为1,1变为0
简单记忆成减去-1
对一个小数连续进行两次二进制否运算,能达到取整效果。
~~2.9 // 2
~~47.11 // 47
~~1.9999 // 1
~~3 // 3
使用二进制否运算取整,是所有取整方法中最快的一种。
对字符串进行二进制否运算,JavaScript 引擎会先调用Number函数,将字符串转为数值。
// 相当于~Number("011")
~"011" // -12
// 相当于~Number("42 cats")
~"42 cats" // -1
// 相当于~Number("0xcafebabe")
~"0xcafebabe" // 889275713
// 相当于~Number("deadbeef")
~"deadbeef" // -1
// 相当于 ~Number([])
~[] // -1
// 相当于 ~Number(NaN)
~NaN // -1
// 相当于 ~Number(null)
~null // -1
异或运算符
异或运算(^)在两个二进制位不同时返回1,相同时返回0。
相当于加 与相当于乘以
用“异或运算”可以在不引入临时变量的前提下,互换两个变量的值。
var a = 10;
var b = 99;
a ^= b, b ^= a, a ^= b;
a // 99
b // 10
这是互换两个变量的值的最快方法。
异或运算也可以用来取整。
12.9 ^ 0 // 12
左移运算符
左移运算符(<<)表示将一个数的二进制值向左移动指定的位数,尾部补0,即乘以2的指定次方
// 相当于乘以2的1次方
4 << 1
// 8
-4 << 1
// -8
如果左移0位,就相当于将该数值转为32位整数,等同于取整,对于正数和负数都有效。
13.5 << 0
// 13
-13.5 << 0
// -13
右移运算符
右移运算符(>>)表示将一个数的二进制值向右移动指定的位数。如果是正数,头部全部补0;如果是负数,头部全部补1。右移运算符基本上相当于除以2的指定次方(最高位即符号位参与移动)
右移运算可以模拟 2 的整除运算。
5 >> 1
// 2
// 相当于 5 / 2 = 2
21 >> 2
// 5
// 相当于 21 / 4 = 5
21 >> 3
// 2
// 相当于 21 / 8 = 2
21 >> 4
// 1
// 相当于 21 / 16 = 1
头部补零的右移运算符
该运算的结果与右移运算符(>>)完全一致,区别主要在于负数
查看一个负整数在计算机内部的储存形式,最快的方法就是使用这个运算符。
4 >>> 1
// 2
-4 >>> 1
// 2147483646
-1 >>> 0 // 4294967295
上面代码表示,-1作为32位整数时,内部的储存形式使用无符号整数格式解读,值为 4294967295(即(2^32)-1,等于11111111111111111111111111111111)。
开关作用
位运算符可以用作设置对象属性的开关
假定某个对象有四个开关,每个开关都是一个变量。那么,可以设置一个四位的二进制数,它的每个位对应一个开关。
var FLAG_A = 1; // 0001
var FLAG_B = 2; // 0010
var FLAG_C = 4; // 0100
var FLAG_D = 8; // 1000
9.1然后,就可以用二进制与运算检验,当前设置是否打开了指定开关。
var flags = 5; // 二进制的0101
if (flags & FLAG_C) {
// ...
}
// 0101 & 0100 => 0100 => true
上面代码检验是否打开了开关C。如果打开,会返回true,否则返回false。
9.2
现在假设需要打开A、B、D三个开关,我们可以构造一个掩码变量。
var mask = FLAG_A | FLAG_B | FLAG_D;
// 0001 | 0010 | 1000 => 1011
上面代码对A、B、D三个变量进行二进制或运算,得到掩码值为二进制的1011。
有了掩码,二进制或运算可以确保打开指定的开关。
flags = flags | mask;
二进制与运算可以将当前设置中凡是与开关设置不一样的项,全部关闭。
flags = flags & mask;
异或运算可以切换(toggle)当前设置,即第一次执行可以得到当前设置的相反值,再执行一次又得到原来的值。
flags = flags ^ mask;
二进制否运算可以翻转当前设置,即原设置为0,运算后变为1;原设置为1,运算后变为0。
flags = ~flags;
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/106062.html
摘要:所以就想把一大串缩短点,将二进制中的三位用一位表示。以可以大写也可以小写开头版本可以表示二进制了八进制的数据表现形式由组成。结果把系数基数的权次幂相加即可。因为语言采用的是码来编码的。 1_(常量的概述和使用)* A:什么是常量(constant) 在程序执行的过程中其值不可以发生改变 B:Java中常量的分类 字面值常量 自定义常量(面向对象部分讲) C:字面值常量的...
摘要:位运算符是对其操作数按其二进制形式逐位进行运算。接下来我们逐一讲解位运算符的计算原理按位与用于清零取某些指定位保位的计算原理,,结果上面使用按位与的一段程序运行结果为我们用二进制来分析一下它的计算规则。 C语言中位运算符共有六种 目录 1.&(按位与) 2. |(按位或) 3.^(按位抑或)...
摘要:二进制本身就是为这个数字而使用的,所以说这道面试题直指二进制的使用是没错的。正负在二进制中,第一位为的是负数,是正数。 showImg(https://segmentfault.com/img/bVbd7d0?w=1580&h=732); 前言 使用PHP,给定一个数,判断这个数是否是二的N次方 这样看似简单的一个面试题, 实际牵出了很多基础知识,本章在为大家补习基础知识的情况下来解答...
摘要:上篇文章上篇文章中已经介绍了中的一些常见的运算符的操作,今天介绍上次遗留的一个运算符位运算符。在学习位运算符之前,需要先了解一下二进制的相关概念。二进制在计算机中,只会识别和的二进制数据,位运算符就是把数值都当做二进制来进行计算。 上篇文章中已经介绍了python中的一些常见的运算符的操作,...
阅读 3764·2021-09-23 11:51
阅读 3003·2021-09-22 15:59
阅读 824·2021-09-09 11:37
阅读 2046·2021-09-08 09:45
阅读 1247·2019-08-30 15:54
阅读 2036·2019-08-30 15:53
阅读 471·2019-08-29 12:12
阅读 3264·2019-08-29 11:15