位运算:
直接对二进制的补码进行运算。Java除了具备高级语言的特点外,也支持位运算操作。
在计算机中,有符号数有3种表示方法:原码、反码和补码。计算机的运算都是采用二进制补码进行的。
注:有符号数指二进制的最高位是符号位,其余位置表示数值;无符号数指所有位置表示数值。
原码:二进制定点表示法,即最高位为符号位,0表示正,1表示负,其余位表示数值的大小;
反码:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外;
补码:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
注:正数的原码、反码、补码都相同。
负数的原码、反码、补码如下:
1000-0000 0000-0000 0000-0000 0000-0011 (-3原码)
1111-1111 1111-1111 1111-1111 1111-1100 (-3反码)
1111-1111 1111-1111 1111-1111 1111-1101 (-3补码)
位运算符:
&:AND(并且) -------------------- 两个都是true 结果才是true : false&true = false
|:OR(或者) ----------------------- 只要有一个是true,那么结果就是true: false|true = true
^:XOR(异或) -------------------- 不同为true, 相同为false:true^true=false
~:逐位取反 ---------------------- 把数字转成二进制的补码后逐位(包括符号位)取反
<<:左移位------------------------ 最高位丢弃,空位补0
>>:右移位------------------------ 空位补最高位:正数补1,负数补0;
>>>:无符号右移位------------- 不分正负,空位补0
注意事项:&、|、^作为逻辑运算符时前后连接布尔类型的值,对数字做运算时可以看做位运算符,本质上是对数字的二进 制补码做运算的,此时可以将true看做1,false看做0,优先级顺序为:& > ^ > |;
移位规律: (类似于十进制,左移几位就加几个0,即10的几次方)
左移几位就相当于乘以2的几次方;
右移几位就相当于除以2的几次方;
相关位运算:
class ConstDemo{
public static void main(String[] args){
System.out.println(2|3&5); // 正确答案:3;如不按优先级顺序计算则得1,错误
System.out.println(15>>2); // 3
System.out.println(15<<2); // 60
}
}