位运算
目录
- 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,等于把个位取反,翻转