位运算
位运算操作
右移操作 >>
将一个运算对象的各二进制位全部右移若干位:
- 正数左补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,等于把各位取反(翻转)
位运算经典题目
- 面试题 16.01. 交换数字
- 面试题 16.07. 最大数值
- 剑指 Offer 65. 不用加减乘除做加法
- 剑指 Offer 15. 二进制中1的个数
- 剑指 Offer 56 - I. 数组中数字出现的次数
- 剑指 Offer 56 - II. 数组中数字出现的次数 II
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();
}
}