类似于位移的函数或算法,返回数字输入的四个字节输出

时间:2016-03-01 16:04:15

标签: c++ c algorithm

您好我正在尝试开发一个C ++函数或算法,其行为类似于位移,该函数将始终返回任意数字输入的4字节00 00 00 00,范围从099999999 < / 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");

我将非常感谢您解决此问题的任何提示或解决方案,提前谢谢

2 个答案:

答案 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;
}