js 中的~~含义
~ bitwise NOT 运算符
~对操作数按位取反,两个的意思即作两次取反操作,其实是等作原数本身(操作数是32整数范围内)
~~(Math.random()*7) //即 var n = Math.random() * 7; n = ~n; n = ~n;//其实和初始值一样
和对BOOLEAN类型的做两次 ! 操作是一个意思,只不过是把小数位给去掉了,即取整数。
console.log(~~(3.7348286093143717)) //3
总结:~是js里的按位取反操作符 , ~~ 就是执行两次按位取反,其实就是保持原值,但是注意虽然是原值,但是对布尔型变量执行这个操作,会转化成相应的数值型变量,也就是
~~true === 1,~~false === 0, ~~"" == 0 , ~~[] == 0
推荐用>>操作符,一次即可:
var n = Math.random() * 7;
n = n>>0;
~运算符的详细解释:
将 expression 转换为一个 32 位带符号整数,然后按位对 1 求补。即,将结果中为 0 的每一位设置为 1,并将结果中为 1 的每一位设置为 0。结果是一个带符号的 32 位整数。此运算符也称为对一求补运算符或按位求补运算符。
例如,十六进制值 0x7777 表示为二进制数:
0111011101110111
该十六进制值 ~0x7777 的按位取反的二进制数为:
1000100010001000
在十六进制中,它是 0x8888。因此,~0x7777 就是 0x8888。
按位运算符的最常见用法是提供特征位(为每一位填充一个布尔值)。
扩展:
十六进制转二进制:
十六进制(Hexadecimal)是一种逢16进1的进位计数制,使用16个符号来表示数值。这些符号包括0-9的阿拉伯数字和A-F的字母(其中A代表10,B代表11,C代表12,D代表13,E代表14,F代表15)。因此,在十六进制中,“A”表示十进制中的数值10。
要将十六进制的“A”转换为二进制,我们需要将这个十进制数值10转换成二进制形式。二进制是一种逢2进1的进位计数制,使用两个符号0和1来表示数值。
转换步骤如下:
- 将十进制数10除以2,得到商5和余数0。
- 将商5继续除以2,得到商2和余数1。
- 再将商2除以2,得到商1和余数0。
- 最后将商1除以2,得到商0和余数1。
此时,所有的商都为0,无需继续除法。按照“倒序取余”的规则,将上述每次除法得到的余数从下往上排列,即构成了十进制数10对应的二进制数:
110 (十进制) = 1010 (二进制)
所以,十六进制的“A”对应的二进制是1010
。
二进制转十进制:
1、确定二进制数的每一位
二进制数由若干个0和1组成,每个位置上的数字代表不同的权重。最右边的位(通常称为最低位,LSB)的权重最小,往左依次增大,每向左一位,权重翻倍。
2、计算每位二进制位的值
对于二进制数中的每一位,将其值乘以其对应的权重(即2的幂次方)。具体权重由该位的位置决定,从右向左数第一位的权重是2的0次幂(即1),第二位的权重是2的1次幂(即2),第三位的权重是2的2次幂(即4),依此类推。
3、求和
将各位二进制位的值与其权重的乘积相加,得到的总和就是该二进制数对应的十进制数值。
示例:
将二进制数10110
转换为十进制数。
- 第一位(最右边的位)是0,权重为2的0次幂=1,所以其值为0 x 1= 0
- 第二位是1,权重为2的1次幂=2,所以其值为1 x 2= 2
- 第三位是1,权重为2的2次幂=4,所以其值为1 x 4= 4
- 第四位是0,权重为2的3次幂=8,所以其值为0 x 8= 0
- 第五位(最左边的位)是1,权重为2的4次幂=16,所以其值为1 x 16= 16
将这些值相加:0 + 2 + 4 + 0 + 16 = 22
因此,二进制数10110
对应的十进制数是22
。