您好我正在尝试开发一个C ++函数或算法,其行为类似于位移,该函数将始终返回任意数字输入的4字节00 00 00 00
,范围从0
到99999999
< / p>
input(int) - &gt;预期输出(字符或字符串)
0 -> 00 00 00 00
20 -> 00 00 20 00
200 -> 00 02 00 00
2000 -> 00 20 00 00
99999999-> 99 99 99 99
可以反转以返回原始数字。
输入(字符或字符串) - &gt;预期产出(int / double)
00 00 20 00 -> 20
00 02 00 00 -> 200
00 20 00 00 -> 2000
99 99 99 99 -> 99999999
修改:
这是我的代码。它接近我正在寻找但仍在进行中的工作:
void Convert_to_Decimal(std::string str)
{
double ret;
///insert . after string number 6.
str.insert(5,1,'.');
str.erase(0, str.find_first_not_of('0'));
///remove leading zeros
ret =std::stod(str.c_str());
printf("%g\n", ret);
}
Convert_to_Decimal("00020000");
我将非常感谢您解决此问题的任何提示或解决方案,提前谢谢
答案 0 :(得分:0)
对于整数,让我们将移位定义为将数字乘以或除以其表示基数
对于十进制,右移:
300 --> 30
十六进制:
0x345 --> 0x34
二进制:
1101 --> 110
对于十进制,右移一位需要除以10.对于十六进制,除以16,对于二进制,除以2.
向左移动乘以基数:十进制 - 乘以10,十六进制乘以16,二进制乘以2.
当移位超出数字边缘时,您无法通过移动另一个方向来恢复原始数字。
例如,向右移动345个数字会产生34.没有办法通过向左移动一个数字来获得5。通用规则是当数字移位时,引入新的数字0。因此34左移一位数产生340.
关于你的浮点数。我没有看到字节99 99 99 99如何产生999999.99。最后一个字节总是在小数点的右边吗?
要移动字节,请使用运算符&lt;&lt;和&gt;&gt;。您希望使用包含字节数量的最大大小整数,例如uint32_t
表示4字节值。另外,请使用unsigned
数字,因为您不希望签名表示干扰转换。
编辑1:示例功能
uint32_t Shift_Left(unsigned int value, unsigned int quantity)
{
while (quantity > 0)
{
value = value * 2;
}
return value;
}
uint32_t Shift_Left(unsigned value, unsigned int quantity)
{
return value << quantity;
}
对于按字节移位,将数量设置为8或8的倍数(每字节8位)。
答案 1 :(得分:0)
这是一个简单的解决方案:
#include <stdint.h>
/* encode a number given as a string into a 4 byte buffer */
void number_convert(unsigned char *dest, const char *str) {
uint32_t v = 0;
while (*str >= '0' && *str <= '9') {
/* parse digits and encode as BCD */
v = (v << 4) + (*str++ - '0');
}
/* make room for 2 decimal places */
v <<= 8;
if (*str == '.') {
if (str[1] >= '0' && str[1] <= '9') {
/* set number of tenths */
v += (str[1] - '0') << 4;
if (str[2] >= '0' && str[2] <= '9') {
/* set number of hundredths */
v += (str[2] - '0');
}
}
}
/* store the BCD value in big endian order */
dest[0] = (v >> 24) & 255;
dest[1] = (v >> 16) & 255;
dest[2] = (v >> 8) & 255;
dest[3] = (v >> 0) & 255;
}
void test(const char *str) {
unsigned char buf[4];
number_convert(buf, str);
printf("%s -> %02X %02X %02X %02X\n", str, buf[0], buf[1], buf[2], buf[3]);
}
int main(void) {
test("0");
test("20");
test("200");
test("2000");
test("123.1");
test("999999.99");
return 0;
}
修改强>
您的代码使用float
变量。你的问题不清楚:你想计算4个字节吗?要做到这一点,你应该使用一个字节数组,否则,请扩展一个更准确的解释,你想要实现的聊天。
要执行从4字节数字数组到数字的转换,您可以执行以下操作:
double convert_BCD_to_double(unsigned char *str) {
long res = 0;
for (int i = 0; i < 4; i++) {
res = res * 100 + (str[i] >> 4) * 10 + (str[i] & 15);
}
return (double)res / 100;
}