jdk版本:1.8
准备工作
十进制转二进制:
- 十进制转二进制就是用十进制的数字去除以2,直到商为0或1为止。例如:10
10除以2 余数为 0,5 除以 2 余数为 1, 2 除以 2 余数为 0 ,最后剩下 1,所以10的二进制表示为
1010(8 4 2 1)= 10
代码实现:
public static void main(String[] args) {
/* 十进制转二进制 */
System.out.println(toBinary(10));
}
private static String toBinary(int num) {
StringBuilder sb = new StringBuilder();
while (num != 0){
sb.append(num % 2);
num = num / 2;
}
return sb.reverse().toString();
}
// 打印结果
1010
二进制转十进制:
- 例如:1010 就是 (2^3)1 + (2^2)0 + (2^1)1 + (2^0)0 = 8 + 0 + 2 + 0 = 10
代码实现:
System.out.println(Integer.parseInt("1010",2));
// 打印结果
10
位异或运算(^)
运算规则:两个数转换为二进制,从高位比较,如果相同为0,不同为1。
例如:10 ^ 2 ===> 1010 ^ 0010 ===> 1000 = 8
代码实现:
System.out.println(10^2);
// 打印结果
8
位与运算符(&)
运算规则:两个数转换为二进制,从高位比较,如果两个数都是1 为 1,否则为0。
例如:10 & 2 ===> 1010 & 0010 ===> 0010 = 2
代码实现:
System.out.println(10 & 2);
// 打印结果
2
位或运算符(|)
运算规则:两个数转换为二进制,从高位比较,如果两个数有一个1 则为 1,否则为0。
例如:10 | 2 ===> 1010 | 0010 ===> 1010 = 10
代码实现:
System.out.println(10 | 2);
// 打印结果
10
位非运算符(~)
运算规则:如果位为0 则 为 1,如果位为 1 则为 0。
例如:10 ===> 0000 1010
~10 ===> 1111 0101
因为10取反的补码是负数,所以求原码需要:将补码忽略符号位取反码 + 1
即:1000 1010 + 1 ===> 1000 1011 = -11
代码实现:
System.out.println(~10);
// 打印结果
-11
java中的 << >> >>>运算符
- << :表示左移,不分正负数,低位补0。
- >> :表示右移,如果是正数,高位补0,如果是负数,高位补1。
- >>>:表示无符号右移,也叫逻辑右移,不管正负数高位全都补0。
代码实现:
/* 正数的原码与补码相同 */
System.out.println(2 << 1);
// 补码:0000 0010 左移一位,低位补0 0000 0100 原码:0000 0100 ===> 4
System.out.println(-2 << 1);
// 原码:1000 0010 反码:1111 1101 补码:1111 1110 左移一位,低位补0 1111 1100
// 再将补码求原码,即: 反码:1000 0011 反码+1为补码(也是当前数原码):1000 0100 ===> -4
System.out.println(2 >> 1);
// 补码:0000 0010 右移一位,高位补0 0000 0001 原码:0000 00001 ===> 1
System.out.println(-2 >> 1);
// 原码:1000 0010 反码:1111 1101 补码:1111 1110 右移一位,高位补1 1111 1111
// 再将补码求原码,即: 反码:1000 0000 反码+1为补码(也是当前数原码):1000 0001 ===> -1
System.out.println(-2 >>> 1);
System.out.println(Integer.MAX_VALUE);// 2147483647
// 原码:1000 0000... 0010 反码:1111 1111... 1101 补码:1111 1111... 1110
// 右移一位,高位补0 0111 1111... 1111 正数原码就是补码:值为int类型最大值 = 2147483647
网友评论