【问题标题】:DEC to BIN using for andDEC 到 BIN 使用 for 和
【发布时间】:2017-04-06 19:59:22
【问题描述】:

我在 C++ 中创建了一个返回二进制数的函数时遇到了问题。

function(unsigned short int user_input, int tab[16]) {
for(ii = 0; ??; ii++)
 tab[ii] = i % 2;
 i = i / 2;
}

用户输入 DEC 号码并取回 BIN。

我应该只输入 ii

【问题讨论】:

  • 可能希望通过将 user_input 设置为 uint16_t 类型来保证只有 16 位值。这将更具可移植性,并避免编译器/架构将无符号 short 指定为不是 16 位的情况。见stackoverflow.com/questions/15505828/…
  • 它必须看起来像我写的那样。例如,如果我输入 5 我得到 00000000 00000101
  • 是的,您的代码有效。我并不是说它没有。我建议为避免编译器实现差异,您可以将 user_input 指定为 uint16_t 而不是假设 unsigned short int 始终为 16 位。
  • 那么 'for(ii = 0; ii
  • 这很好。我只是指出一个警告,您可能需要注意各种数据类型的大小,并且允许编译器创建大于 16 位的短裤。

标签: c++ converter


【解决方案1】:

这可行,但有点浪费(如果输入 1,则将 0 除以 2 15 次)。除以 2 也可以通过移位“加速”。这是另一种选择:

function(unsigned short int user_input, int tab[16]) {
    int idx = 0;
    while(user_input > 0)
    {
        tab[idx] = user_input & 1;
        user_input = user_input >> 1;
        idx++;
    }
    for(; idx < 16; idx++)
    {
        tab[idx] = 0;
    }
}

【讨论】:

  • 我几乎可以但不完全可以向您保证,这些分歧会变成轮班。但是,当您使用它时,您也应该摆脱该模式。如果你想做点小玩意,请改用&amp;(我也很确定编译器会这样做)。像这样混合 2 看起来真的很糟糕。
  • 是的...我在这里和其他网站上看到了 while 功能,但我的功能必须开启。
  • 让编译器生成程序集来确定。
  • @MichaelDorgan 谢谢,在工作中半途而废:)。编辑以包括您的修复。至于分歧变成转变,只有当你的编译器足够聪明才能弄清楚这一点时。大多数是,但为什么要冒险呢?
  • @mascoj,我 3/4 自己在工作中评估它 - 等待编译。感谢您的更新:)
【解决方案2】:

更紧凑的版本:

void function(uint16_t x, int b[16]) {
    for (int i = 0; i != 16; ++i, x >>= 1)
        b[i] = x & 1;
}

请注意,这会将最低有效位放入b[0]

回答您的问题:是的,ii &lt; 16 是正确的。这会导致循环迭代 16 次,每次执行循环体时,ii0 变为15,在此期间您检查最后一位然后移位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 2015-06-21
    • 2020-07-03
    • 2016-06-10
    相关资源
    最近更新 更多