Java中有三种移位运算符
<< 左移运算符,num <<1, 相当于 num 乘以2;
>> 右移运算符,num >>1, 相当于 num 除以2;
>>> 无符号右移,忽略符号位,空位都以0不齐;
public class test {
//静态方法--类方法,不需要创建类对象就可以直接调用
public static void printInfo(int num){
System.out.println(Integer.toBinaryString(num));
}
public static void main(String[] args) {
int number = 10;
// number的二进制形式的数
printInfo(number);
number = number << 1;
//左移一位
printInfo(number);
number = number >> 1;
//右移一位
printInfo(number);
number = number >>> 1;
//无符号右移
printInfo(number);
}
}
运行结果:
1010 // 十进制:10 原始数 number
10100 // 十进制:20 左移一位 number = number << 1;
1010 // 十进制:10 右移一位 number = number >> 1;
101 // 十进制:5 无符号右移一位 number = number >>> 1;
对于:>>> 无符号右移,忽略符号位,空位都以0补齐
比如 value >>> num -- num 指定要移位值value 移动的位数。
无符号右移的规则只记住一点:忽略了符号位扩展,0补最高位 无符号右移运算符>>> 只是对32位和64位的值有意义
Java中的 与(&),或(|),异或(^)取反(~)运算
与运算 & 规则 :都为1时才为1; 或运算 | 规则:有一个为1,则为1;
异或运算 ^ 规则:不同为1; 取反运算 ~ 规则:按位取反;
例如,用7和9作为 示例:
public class test {
public static void main(String[] args) {
System.out.println("7 & 9: "+ (7 & 9));
System.out.println("7 | 9: "+(7 | 9));
System.out.println("7 ^ 9: "+(7 ^ 9));
System.out.println("~ 9 : "+(~ 9));
System.out.println("~ -9 : "+(~ -9));
//0与任意非零整数的异或运算均不变,仍为原数;
System.out.println("0 ^ 9: "+(0 ^ 9));
}
}
运算结果如下( 7二进制 0111,9二进制 1001):
7 & 9: 1 // 0111 & 1001 = 0001 > 1
7 | 9: 15 // 0111 | 1001 = 1111 > 15
7 ^ 9: 14 // 0111 ^ 1001 = 1110 > 14
~ 9 : -10
~ -9 : 8 // 较为特殊,
0 ^ 9: 9 // 0000 & 1001 = 1001 > 9
/*
9 二进制 0000 0000 0000 0000 0000 0000 0000 1001
* 1111 1111 1111 1111 1111 1111 1111 0110 取反之后变成负数了
* 1000 0000 0000 0000 0000 0000 0000 1001 补码
* 1000 0000 0000 0000 0000 0000 0000 1010 原码 == -10
-9 二进制 1000 0000 0000 0000 0000 0000 0000 1001
* 1111 1111 1111 1111 1111 1111 1111 0110 负数先转成补码
* 1111 1111 1111 1111 1111 1111 1111 0111 补码
* 0000 0000 0000 0000 0000 0000 0000 1000 得到负数的补码之后进行取反 (这时得到的是正数) 8
*/