刷题第四天

这道题比较简单,主要时注意细节,比如整数有正负之分,在输出的时候注意要输出正负。

calss solution{
    public:
    string converToBase7(int num){
    if(num == 0){
        return "0";
        }
    bool negative = num < 0;
    num = abs(num);
    string digits;
    while(num > 0){
        digits.push_back(num % 7 + '0');
        num /= 7;
                
    }
    if(negative){
        digits.push_back('_'); 
    }
    reverse(digits.begin(),digits.end());
    return digits.;
}

后面来个难一点的。

 在补码运算中,最高为表示符号位,符号位是0表示正整数和零,符号位是1表示负整数。32位有符号整数的二进制有32位,由于一位16进制数对应四位二进制数,因此32位有符号整数的十六进制数有8位,将num的二进制数按四位为一组分成8组,依次将每一组转换为对应的十六进制数,即可得到num的十六进制数。

假设二进制数的8组从低位到高位依次是第0组到第7组,则对于第i组,可以通过(nums>>(4*i))&0xf得到该组的值,其取值范围是0到15(即十六进制的f)。将每一组的值转换为十六进制数的作为如下:

对于0到9,数字本身就是十六进制;

对于10到15,将其转换为a到f中的对应字母。

对于负整数,由于最高位一定不是0,因此不会出现前导为0。对于零和正整数,可能出现前导零。避免前导零的做法如下:

如果num=0,则直接返回0

如果num>0,则在遍历每一组的值时,从第一个不是0的值开始拼接成十六进制数。

calss solution{
    public:
    string converToBase16(int num){
    if(num == 0){
        return "0";
        }
    string sb;
    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);
        sb.push_back(digit);
}
        
    }
return sb;
}

 总结:

第一题考察取余和取整,第二题考察的是位运算。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值