【手撕代码】十进制转二进制转十六进制

十进制转二进制
#include <iostream>
using namespace std;

string toBin(int num){
    // int -> int32_t
    string tmp(32, '0');
    // 标记最左侧的不为0的下标
    int startPos = 31;
    // 赋值
    for(int i = 0; i < 32; i++){
//        if(num & (1 << i)){
        if((num >> i) & 0x01){
            tmp[31 - i] = '1';
            startPos = 31 - i;
        }
    }
    string binStr = tmp.substr(startPos);
    return binStr;
}

int main() {
    cout << toBin(10) << endl;
    cout << toBin(0) << endl;
    cout << toBin(-1) << endl;
    cout << toBin(-2) << endl;
    cout << toBin(INT_MAX) << endl;
    cout << toBin(INT_MIN) << endl;
}


-------------------------------------------------------
1010
0
11111111111111111111111111111111
11111111111111111111111111111110
1111111111111111111111111111111
10000000000000000000000000000000

进程已结束,退出代码 0
十进制转十六进制
#include <iostream>
#include <algorithm>
using namespace std;

string toHex(int num){
    // int 32  8个4位  (1 1 1 1) 4位一个16进制
    string hex = "0123456789ABCDEF";

    string tmp(8, '0');

    for(int i = 0; i < 8; i++){
//        tmp[7-i] = hex[(num & (0xf << 4*i)) >> 4*i];
        tmp[7-i] = hex[((num >> 4*i) & 0xf)];
    }

    // 找到左侧最后一个0
    int left = 0;
    for(; left < tmp.size(); left++){
        if(tmp[left] != '0') break;
    }
    // 至少要有一个尾部的0
    left = min(left, int(tmp.size()-1));

    return tmp.substr(left);
}


int main() {
    cout << toHex(10) << endl;
    cout << toHex(0) << endl;
    cout << toHex(-1) << endl;
    cout << toHex(-2) << endl;
    cout << toHex(INT_MAX) << endl;
    cout << toHex(INT_MIN) << endl;
}


-------------------------------------------------------
A
0
FFFFFFFF
FFFFFFFE
7FFFFFFF
80000000

END

转为可见字符 Q1
#include <iostream>

using namespace std;

#define LEN_IN 16
#define LEN_OUT 32

class CharToHex{
public:
    CharToHex(){}
    ~CharToHex(){}

    void chr2Hex(unsigned char* A, int len){
        int startIdx = 0;
        for(int i = 0; i < len; i++){
            string single = toHex(int(A[i]));
            if(single.size() == 1){
                B[startIdx++] = '0';
            }
            for(auto c: single){
                B[startIdx++] = c;
            }
        }
    }

private:
    string toHex(int num){
        string tmp(8, '0');
        for(int i = 0; i < 8; i++){
            tmp[7-i] = hex[((num >> 4*i) & 0xf)];
        }
        int left = 0;
        for(; left < tmp.size(); left++){
            if(tmp[left] != '0') break;
        }
        left = min(left, int(tmp.size()-1));
        return tmp.substr(left);
    }

private:
    string hex = "0123456789abcdef";
public:
    // 得到的返回值
    unsigned char B[LEN_OUT];
};


void solution_CharToHex(){
    // 输入的值
    unsigned char A[LEN_IN];
    A[0] = 188;

    CharToHex cth;
    cth.chr2Hex(A, LEN_IN);

    for(int i = 0; i < LEN_OUT; i++){
        cout << int(cth.B[i]) << " ";
    }
}





int main() {
    solution_CharToHex();
    return 0;
}

Name&Salary Q2
#include <iostream>
#include <string.h>

using namespace std;

typedef struct staff_info{
    char name[40];
    int date;
    staff_info *next;
}staff_info;


staff_info *compute_salary(const char *s){
    staff_info *head = NULL;
    staff_info *tmp = NULL;

    char outName[40];
    int maxSalary = 0;
    memset(outName, '\0', 40);

    int idx = 0;
    while(s[idx] != '\0'){

        staff_info *node = NULL;
        if(s[idx] == '>'){
            node = new staff_info();
            memset(node->name, '\0', 40);
            node->next = NULL;
            idx++;
        }

        int l = 0;
        while(s[idx] != '$'){
            node->name[l++] = s[idx++];
        }
        // $ -> next
        idx++;
        string salary;
        while(s[idx] != '>' && s[idx] != '\0'){
            salary += s[idx++];
        }
        int tmpSalary = stoi(salary);

        node->date = tmpSalary;

        if(tmpSalary > maxSalary){
            maxSalary = tmpSalary;
            memcpy( outName, node->name,40);
        }

        if(head == NULL){
            head = node;
            tmp = node;
        } else{
            tmp->next = node;
            tmp = node;
        }
    }

    tmp->next = head;


    cout << "MaxSalary   [Name]: " << outName << "   [Salary]: " << maxSalary << endl;

    return head;
}


int main() {
    char s[] = ">Zhang$12000>Wang$9114>Li$8456";
    staff_info *head = compute_salary(s);
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值