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来表示数值。

转换步骤如下:

  1. 将十进制数10除以2,得到商5和余数0。
  2. 将商5继续除以2,得到商2和余数1。
  3. 再将商2除以2,得到商1和余数0。
  4. 最后将商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

 

posted @ 2024-04-08 11:16  阳光下的向日葵  阅读(932)  评论(1编辑  收藏  举报