按位与运算符(&)
运算符 & 对它 的整形参数逐位执行布尔and操作。只有两个运算符中相应位都为1,那么结果中的这一位才为1.例如 0x1234 & 0x00f f= 0x0034;
按位或运算符( | )
运算符 | 对它 的整形参数逐位执行布尔 or 操作。只有其中一个运算数中的相应位为1或者两个运算符中相应位都为1,那么结果中的这一位就为1.例如
9 |10=11.
按位异或运算符( ^ )
运算符 ^ 对它 的整形参数逐位执行布尔异或操作。异或是指第一个运算数是true 或者第二个运算数是true,但两者不能同时为true。如果两个运算数中只有一个数的相应位为1(但不能同时为1),那么结果中的相应的这一位 就为1 。例如:9^10=3.
按位非运算符(~)
运算符 ~ 是一个一元运算符,它位于一个整型参数之前,它将运算数 所有位取反。根据javascript中带符号的整数的表示方法,对一个值使用 ~ 运算符相当于改变它的符号并且减1.例如~0x0f =0xfffffff0.
左移运算符(<<)
运算符(<<)左移第一个数中的所有位,移动的位数由第二个运算数指定,移动的位数应该是一个0到31的整数。例如,在表达式a<<1中,a的第一位变成了它的第二位,啊的第二位变成了它的第三位,以此类推。新的第一位用0来补充,舍弃第32位的值。将一个值左移1位相当于对它乘以2
负数左移也是一样的,可以用负数的补码来验证(注意:在转换反码的时候符号位不要变)
(这里用单字节演示)
比如 -5(十进制)--->(1000 0101)(原码)---->(1111 1010)(反码)------->(1111 1011)(补码)
左移 1 位得到的结果为 (1111 0110)(补码)---------(减1)-->(1111 0101)(反码)------->(1000 1010)(原码 -10)
带符号的右移运算符(>>)
运算符(>>) 右移第一个运算数中的所有位,移动的位数由第二个运算数指定,移动的位数应该是一个0到31的整数。舍弃右边溢出的位,填补左边的位由原运算数的符号位决定,以便保持结果的符号与原操作数一致。如果第一个运算数是正的,就用0填补结果的高位;如果第一个运算数是负的,就用1填补结果的高位.。将一个值右移1位,相当于用2除它(丢弃余数),右移2位,相当于用4除以它,以此类推 。例如:7>>1=3 -7>>1=-4(自己验证)
例如(还是以单字节说明)
-10>>2 -10-------(1111 0101)(补码)-----右移两位--->>(1111 1101)------(减1)--->(1111 1100)---(反码)--->(1000 0011)(-3)
无符号的右移运算符(>>>)
运算符>>> 和运算符 >> 一样,只是从左边移入总是以0补充,与原运算符的符号无关。例如 -1>>4 =-1 -1>>>4=268435455
以4个字节为例: -1:(11111111......11111111)--------(右移4位)---->(0000 1111 1111....1111)=2的28次方-1
以单字节为例:-1(1111 1111)--------(右移4位)---->(0000 1111)=2的5次方-1
原码:将一个整数,转换成二进制,就是其原码。如单字节的5的原码为:0000 0101;-5的原码为1000 0101。
反码:正数的反码就是其原码;负数的反码是将原码中,除符号位以外,每一位取反。如单字节的5的反码为:0000 0101;-5的原码为1111 1010。
补码:正数的补码就是其原码;负数的反码+1就是补码。如单字节的5的补码为:0000 0101;-5的原码为1111 1011。