位运算


目录
  • 405. 数字转换为十六进制数
    • 思路
    • 代码
  • 总结
    • 右移操作 >>
    • 左移操作 <<
    • 与操作&
    • 异或操作^

405. 数字转换为十六进制数

思路

在补码运算中,最高位表示符号位,符号位是 0 表示正整数和零,符号位是 1 表示负整数。32 位有符号整数的二进制数有 32 位,由于一位十六进制数对应四位二进制数,因此 32 位有符号整数的十六进制数有 8 位。将 num 的二进制数按照四位一组分成
8 组,依次将每一组转换为对应的十六进制数,即可得到 num 的十六进制数。

假设二进制数的 8 组从低位到高位依次是第 0 组到第 7 组,则对于第 i 组,可以通过 (nums>>(4×i)) & 0xf 得到该组的值,其取值范围是 0 到 15(即十六进制的 f)。

0xf:16进制的f转成10进制为15 , 15转换成二进制为 1111。

代码

class Solution {
    public String toHex(int num) {
        if (num == 0) {
            return "0";
        }
        StringBuffer sb = new StringBuffer();
        for (int i = 7; i >= 0; i --) {
            int val = (num >> (4 * i)) & 0xf;
            if (sb.length() > 0 || val > 0) {
                char digit = val < 10 ? (char) ('0' + val) : (char) ('a' + val - 10);
                sb.append(digit);
            }
        }
        return sb.toString();
    }
}

总结

右移操作 >>

将一个运算对象的各二进制位全部右移若干位:

  • 正数左补0,负数左补1,右边丢弃
  • 一个数右移1位,相当于该数除以2

左移操作 <<

将一个运算对象的各二进制位全部左移若干位:

  • 左边的二进制位丢弃,右边补0
  • 一个数左移1位,相当于该数乘以2

与操作&

  • 一个数与1,相当于判断末位是否是1,也就是可以判断奇偶。

  • 得到最后一个二进制位为 1 的数字

    • 二进制负数存的是补码
    public static void main(String[] args){
        int xor = 5;
        int mask = xor & (-xor);

        System.out.println("正数:"+Integer.toBinaryString(xor));
        System.out.println("负数:"+Integer.toBinaryString(-xor));
        System.out.println("结果:"+mask);
    }

    正数:101
    负数:11111111111111111111111111111011
    结果:1

异或操作^

相同取0,相异取1:

  • 一个数异或自己,等于0
  • 一个数异或0,等于自己
  • 一个数异或1,等于把个位取反,翻转