程序员面试金典-0506-整数转换
十进制转二进制没有库函数,刷题两次遇到需要调用该函数,就写了函数con_int_to_bin()。很不简洁:对于-2147483648取反需要考虑溢出问题。可以直接通过位运算来转化?下周试一试~
十进制转二进制可以通过位运算直接算:
int * con_int_to_bin(int num,int *data,int len){
int temp = 1;
int d = num;
int i = 0;
for(i=len-1;i>-1;i--){
int t = (d&temp);
data[i]=t;
d = d>>1;
}
return data;
}
整数转换。编写一个函数,确定需要改变几个位才能将整数A转成整数B。
示例1:
输入:A = 29 (或者0b11101), B = 15(或者0b01111)
输出:2
示例2:
输入:A = 1,B = 2
输出:2
提示:
A,B范围在[-2147483648, 2147483647]之间
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/convert-integer-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
int *con_int_to_bin(int num,int *data,int len){
//1.convert the integer to binary ,len is 32
//int :-2147483648 ~2147483647
int i=0;
for(i=0;i<len;i++)
data[i]=0;
if(num==-2147483648){
data[0]=1;
return data;
}
int net_flag=0;
int t=num;
if(t<0){
t=-num;
net_flag=1;
}
i=len-1;
while(t!=0){
int temp=t%2;
data[i]=temp;
t=t/2;
i--;
}
if(net_flag==1){
//1.1negate
for(i=0;i<len;i++){
if(data[i]==0)
data[i]=1;
else
data[i]=0;
}
//1.2add one
int add_one_flag=0;
for(i=len-1;i>-1;i--){
int temp = add_one_flag+data[i];
if(i==31)
temp=temp+1;
if(temp==2){
data[i]=0;
add_one_flag=1;
}
else{
data[i]=temp;
add_one_flag=0;
}
}
}
return data;
}
int convertInteger(int A, int B){
//1.convert int to binary
//2.compare each bit and record different situations
//1.convert int to binary
int *d1=malloc(sizeof(int)*32);
int *d2=malloc(sizeof(int)*32);
int len=32;
d1=con_int_to_bin(A,d1,len);
d2=con_int_to_bin(B,d2,len);
//2.compare each bit and record different situations
int ret=0;
int i=0;
for(i=0;i<len;i++){
if(d1[i]!=d2[i])
ret++;
}
free(d1);
free(d2);
return ret;
}