十进制转二进制
#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;
}