如何在C++中将二进制编码十进制转换为 int
How to convert Binary Coded Decimal to int in C++
给定 c++ 中的十六进制值 0x80(作为uint16_t提供),我将如何将数字提取到 int 变量中。我不想将十六进制转换为 int,而是想将数字提取为 int,因此,例如,对于0x80我想要 80 的 int,而不是 128,或者对于0x55我想要 55 而不是 85,等等。
uint16_t hex = 0x80;
uint8_t val = ???; // Needs to be 80
仅十六进制数字的数字永远不会发生。 即输入将仅由十进制数字组成。
例如0x08、0x09、0x10、0x11、0x12等。
一个简单的实现,如下所示:
int from_hex(uint16_t h)
{
int d = 0;
int power = 1;
while (h)
{
// assert(h % 16 < 10)
d += h % 16 * power;
h /= 16;
power *= 10;
}
return d;
}
并感谢以下轻微威胁:
int from_hex(uint16_t h)
{
int d = 0;
int power = 1;
while (h)
{
// assert(h % 16 < 10)
d += (h & 15) * power;
h >>= 4;
power *= 10;
}
return d;
}
我很高兴知道我的代码是否有问题
既然你说十六进制数从不包含'a'、'b'等,那么这段代码应该可以解决问题:
#include <iostream>
int main() {
uint16_t in = 0x4321;
int t = (1000 * ((in & 0xf000) / (16*16*16))) +
(100 * ((in & 0xf00) / (16*16))) +
(10 * ((in & 0xf0) / 16)) +
(1 * ((in & 0xf) / 1));
std::cout << t << std::endl;
return 0;
}
输出
4321
解释
= 0xWZYX 中的 16 位十六进制数计算为
in = W*16^3 + Z*16^2 + Y*16^1 + X*16^0 (or just W*16^3 + Z*16^2 + Y*16^1 + X)
做的时候
in & 0xf000 you get 0xW000
做的时候
0xW000 / 16^3 you get 0x000W or just W
做的时候
1000 * W you get W000 decimal
然后对每个数字重复该模式。
使用移位的替代实现
#include <iostream>
int main() {
uint16_t in = 0x9321;
int t = (1000 * ((in & 0xf000) >> 12)) +
(100 * ((in & 0xf00) >> 8)) +
(10 * ((in & 0xf0) >> 4)) +
(1 * ((in & 0xf) >> 0));
std::cout << t << std::endl;
return 0;
}
对于 16 位无符号整数,可以写出四行。但是,如果您希望为较大的无符号 int 使用类似的函数,最好执行循环以保持代码更紧凑和可维护。
使用循环的 64 位解决方案
#include <iostream>
int64_t directHexToDec(uint64_t in)
{
int64_t res = 0;
uint64_t mask = 0xf;
uint64_t sh = 0;
uint64_t mul = 1;
for (int i=0; i<16; ++i)
{
res += mul * ((in & mask) >> sh);
mul *= 10;
mask <<= 4;
sh += 4;
}
return res;
}
int main() {
uint64_t in = 0x987654321;
int64_t t = directHexToDec(in);
std::cout << t << std::endl;
return 0;
}
输出
987654321
使用流和字符串转换的更简单的答案。请注意,这在0x0A
、0X0B
、...值。
uint16_t val = 0x80;
std::stringstream stream;
stream << std::hex << val;
std::string resultStr(stream.str());
// In case of 0xYY hex value be carefull that YY fits into an uint8_t,
// otherwise this will overflow
uint8_t result = static_cast<uint8_t>(std::stoi(resultStr));
这应该适用于十六进制<= 0x99:
#include <iostream>
unsigned int foo(unsigned int hex)
{
return hex - (hex >> 4) * 6;
}
/* Test */
int main()
{
unsigned int vals[] = {0x08, 0x09, 0x10, 0x11, 0x12, 0x80};
for (int i = 0; i < sizeof(vals) / sizeof(vals[0]); i++)
std::cout << foo(vals[i]) << std::endl;
return 0;
}
结果:
8
9
10
11
12
80
相关文章:
- 如何确定我已使用非编码文件到达 EOF?
- visual在c++中将十进制数转换为二进制数
- C++十进制到二进制,如何转换
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 在卡萨布兰卡形成编码参数的列表
- 使用C++进行游程编码
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 计算十进制 c++ 之后的数字
- C++从二进制转换为十进制数
- 使用已使用 java 编码的 openssl 解码数据
- 有没有办法通过使用十进制 ASCII 代码自动类型扣除来获取字符?
- boost 是否有按特殊类型值编码状态"compact optional"?
- 为什么有时我输入一个整数,程序将第一个输入的数字打印成十进制数?
- Geeksforgeeks C 程序故障排除:IEE 754 表示法为十进制
- 如何在CPP的给定目录中列出UTF编码的文件名?
- 如何使用 C++将 ISO-2022-KR 编码转换为 UTF-8 编码?
- 如何在C++中将二进制编码十进制转换为 int
- 增强数据的序列化十六进制十进制编码
- base64,以减少编码十进制数所需的位数
- 将二进制编码的十进制(BCD)解码为无符号整数