美文网首页HashMap
Map源码阅读预热 01——java中的运算符

Map源码阅读预热 01——java中的运算符

作者: 从零开始的程序猿生活 | 来源:发表于2020-12-02 22:57 被阅读0次

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

相关文章

网友评论

    本文标题:Map源码阅读预热 01——java中的运算符

    本文链接:https://www.haomeiwen.com/subject/xxfpwktx.html