5.1插入
其实就是一个简单的二进制的处理,pass
class Solution {
public int insertBits(int N, int M, int i, int j) {
//就一位一位的去做
int ans=0,bit;
M<<=i;
for(int k=0;k<32;k++){
if(k>=i && k<=j){
bit=M&(1<<k);
}else{
bit=N&(1<<k);
}
ans+=bit;
}
return ans;
}
}
取一个二进制位就是去&对应的(1<<k)
5.2 二进制数转字符串
用的计算机组成原理的那个十进制转二进制(小数层面)的方法。pass
class Solution {
public String printBin(double num) {
StringBuilder sb=new StringBuilder("0.");
for(int i=0;i<33;i++){
num*=2;
if(num>=1){
sb.append("1");
num-=1;
}else{
sb.append("0");
}
if(num==0) break;
}
if(sb.length()>32) return "ERROR";
return sb.toString();
}
}
5.3 翻转数位
pre是之前的有多少个1
cur是现在的有多少个1
如果num是32个1组成的,则要进行res>32的处理
class Solution {
public int reverseBits(int num) {
int res=0,cur=0,pre=0;
for(int i=0;i<32;i++){
if((num&1)==1) cur++;
else {
pre=cur;
cur=0;
}
num=num>>1;
res=Math.max(res,pre+cur+1);
}
if(res>32) return 32;
return res;
}
}
5.4下一个数
思路:
找到稍微大的数:
找到第一个01变成10
最简单情况 …00000111 从低位到高位,找到第一个01变成10 0000 0111->0000 1011即可
复杂情况 …0011 1000 找到第一个01变成10以后,把低位的1右移 0011 1000->01011000->0100 0011第三个数是稍微大的,符合题意
找到稍微小的数:
找到第一个10变成01
最简单情况 …1110 0000 从低位到高位,找到第一个10变成01 1110 0000->1101 0000即可
复杂情况 …1110 0011 找到第一个10变成01以后,把低位的1左移 1110 0011->1101 0011->1101 1100 第三个数符合题意。
5.6整数转换
异或,查1的个数
return Integer.bitCount(A^B);
或者详细点可以这么写
int convertInteger(int A, int B){
unsigned int xor = A ^ B, res = 0; // 注意:A:0101,B:1010
while (xor != 0) {
xor = xor & (xor - 1); // 消除低位1的操作
res += 1;
}
return res;
}
5.7配对交换
return ((num & 0x55555555) << 1) | ((num & 0xaaaaaaaa) >> 1);
0x55555555 = 1010101010101010101010101010101 (偶数位为0,奇数位为1)
0xaaaaaaaa = 10101010101010101010101010101010 (偶数位为1,奇数位为0)
十六进制,一个a或者5代表右边4位
5.8绘制直线
题目晦涩难懂,算了。