Insertion
有两个32位整数n和m,请编写算法将m的二进制数位插入到n的二进制的第j到第i位,其中二进制的位数从低位数到高位且以0开始。
给定两个数int n和int m,同时给定int j和int i,意义如题所述,请返回操作后的数,保证n的第j到第i位均为零,且m的二进制位数小于等于i-j+1。
测试样例:
1024,19,2,6
返回:1100
代码实现:
class BinInsert {
public:
int binInsert(int n, int m, int j, int i) {
// write code here
int ins = m << j;
return n & (~((unsigned(0xffffffff) >> (31 - i + j)) << j)) | ins;
}
};
Binary to String
有一个介于0和1之间的实数,类型为double,返回它的二进制表示。如果该数字无法精确地用32位以内的二进制表示,返回“Error”。
给定一个double num,表示0到1的实数,请返回一个string,代表该数的二进制表示或者“Error”。
测试样例:
0.625
返回:0.101
代码实现:
class BinDecimal {
public:
string printBin(double num) {
// write code here
if(num == 0) return "0.0";
if(num == 1) return "1.0";
string res = "0.";
double bin = 0.5;
while(num > 0) {
res += num - bin >= 0 ? '1':'0';
num = (num - bin >= 0)?num - bin:num;
bin /= 2.0;
if(res.size() > 34) return "Error";
}
return res;
}
};
Conversion
编写一个函数,确定需要改变几个位,才能将整数A转变成整数B。
给定两个整数int A,int B。请返回需要改变的数位个数。
测试样例:
10,5
返回:4
代码实现:
class Transform {
public:
int calcCost(int A, int B) {
// write code here
int res = 0;
for(int i = 0; i < 32; i++) {
res += ((A ^ B) & 1);
A = A >> 1;
B = B >> 1;
}
return res;
}
};
当然也可以写成:
class Transform {
public:
int calcCost(int A, int B) {
// write code here
int res = 0;
for(int i = 0; i < 32; i++)
res += (((A >> i) ^ (B >> i)) & 1);
return res;
}
};
Pairwise Step
请编写程序交换一个数的二进制的奇数位和偶数位。(使用越少的指令越好)
给定一个int x,请返回交换后的数int。
测试样例:
10
返回:5
class Exchange {
public:
int exchangeOddEven(int x) {
// write code here
int pre = 0;
for(; pre < 32; pre+=2) {
int xor_pre = ((x >> pre) ^ (x >> (pre+1))) & 1;
x = ((xor_pre << pre) ^ x);
x = ((xor_pre << (pre+1)) ^ x);
}
return x;
}
};