(来自高程我的笔记)关于位操作符的补码与反码与按位非操作符

来源:互联网 发布:mac安装flash插件 编辑:程序博客网 时间:2024/06/08 07:12

位操作符用于最基本的层次上,即按内存中表示的数值的位来操作数值。位操作符不能直接操作64位的值,而是先将64位的值转换为32位的整数,然后执行操作,最后转为64位。对于有符号的整数,32位中的前31位用于表示整数的值,第三十二位表示数值的符号,0表示正值,1表示负值。这个表示符号的位叫做符号位。

负数的同样是以二进制码存储,但使用的格式是二进制补码。计算一个熟知的二进制补码,需要经过三个步骤

1)求这个数值绝对值得二进制码(例如-18的二进制补码,先求18的二进制码)

求-18的二进制补码,首先求得18的二进制码,即

0000 0000 0000 0000 0000 0000 0001 0010

2)求二进制的反码,即将0,1互换;

1111  1111  1111  1111  1111  1111 1110  1101

3)最后,二进制反码加一;

1111  1111  1111  1111  1111  1111 1110  1101

     1(进位)

1111  1111  1111  1111  1111  1111 1110  1110


在对NaN和Infinify值应用位操作符时,会被当做0处理。


按位非(~)

var num = 25;0000 0000 0000 0000 0000 0000 0001 1001

var num2 = ~num;

1111  1111 1111 1111  1111  1111 1110  0110(加一)

1111  1111  1111  11111111  1111 1110  0111(取反)

0000 0000 0000 0000 0000 0000 0001 1000(转换为10进制) 

2的三次方加2的四次方 = 26 ;26加负号  )

alert(num2);//-26


这里对25执行按位非操作,得到了-26.验证了按位非操作的本质,操作数的负值减一。

因此以下代码也能得到相同结果。

var num = 25;

var num2 = -num -1;

alert(num2);//“-26”


按位与(&)

按位与操作在本质上来说就是将两个数值的每一位对齐,然后根据表中规则,执行and操作

第一位第二位结果111100010000
var result = 25 & 3;

alert(result);//1

25 = 0000 0000 0000 0000 0000 0000 0001 1001

  3 = 0000 0000 0000 0000 0000 0000 0000 0011

and=0000 0000 0000 0000 0000 0000 0000 0001

2的0次方 = 1


按位或(|)

第一位第二位结果111101011000

var result = 25 | 3;

alert(result);//27

25 = 0000 0000 0000 0000 0000 0000 0001 1001

  3 = 0000 0000 0000 0000 0000 0000 0000 0011

or  =0000 0000 0000 0000 0000 0000 0001 1011

=27


按位异或(^)

第一位第二位结果110101011000

var result = 25 ^ 3;

alert(result);//26

25 = 0000 0000 0000 0000 0000 0000 0001 1001

  3 = 0000 0000 0000 0000 0000 0000 0000 0011

xor=0000 0000 0000 0000 0000 0000 0001 1010

=26





0 0
原创粉丝点击