20200226
1、比较运算符
JS中的===,绝对等于(值和类型均相等),如:5===5 //true 5==="5" //false
JS中的!==,不绝对等于(值和类型有一个不相等,或两个都不相等),如:5===5 //false 5==="5" //true
2、JAVA位运算符
十进制的运算符是加减乘除,而位运算符则是属于二进制的
&:与,如果相对应的位都是1,则返回1,否则返回0;
|:或,如果对应位有1,则返回1,否则(对应位都是0)返回0;
^:异或,如果对应位的值相等,则返回0,否则返回1;
~:按位非,把每一位取反(即0变1,1变0);
<<:按位左移运算符,右操作数按位左移右操作数指定的位数;
>>:按位右移运算符,左操作数按位右移右操作数指定的位数;
>>>:按位右移补零操作符,左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充;
如:int a = 60; /* 60 = 0011 1100 */ int b = 13; /* 13 = 0000 1101 */
a & b = 0000 1100 = 12; a | b = 0011 1101 = 61; a ^ b = 0011 0010 = 50;
~15 = (0000 1111) → (1111 0000) = -16 (注意:二进制中,最高位是符号位 1表示负数,0表示正数)
12 << 2 = 0000 1100 = 48; 12 << 3 = 96; 8 << 4 = 128;
由此我们得出一个快速的算法:M << n = M * 2n
12 >> 2 =
右移和左移其实是一样的,但是还是有点不同的,不同点在于对于正数和负数补位的时候补的不一样,负数补1,正数补0
-8 >> 2
总结一下,关于负数或者正数来说,移位的时候是一样的,但是在补位的时候,如果最高位是0就补0,如果最高位是1就补1
由此我们得出一个快速的算法:M >> n = M / 2^n
无符号右移(>>>)只对32位和64位有意义,在移动位的时候与右移运算符的移动方式一样的,区别只在于补位的时候不管是0还是1,都补0