程序员面试金典-0506-整数转换

程序员面试金典-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;

}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值