使用按位运算符将十进制转换为八进制

时间:2017-09-01 20:25:49

标签: c++ octal base-conversion

以下函数用于将其参数(整数)从十进制转换为八进制。

std::string dec_to_oct(int num) {
    std::string output;
    for(int i=10; i>=0; --i) {
        output += std::to_string( (num >> i*3) & 0b111 );
    }
    return output;
}

适用于任何正面输入,但num = -1返回77777777777时应返回37777777777,因此第一个数字需要为3一个7。为什么会这样?对于所有负输入,该功能似乎不正确。如何调整算法以使其正确返回负数?

注意:这是一项CS任务,所以我很欣赏提示/技巧。

2 个答案:

答案 0 :(得分:2)

这是因为算术移位保留了数字的符号。为了克服这个问题,首先将输入整数转换为等效的无符号类型。

uint8_t*

更进一步,您可以使函数模板化并将指针强制转换为sizeof的输入,使用include_top=False计算八进制数字的数量(由DanielH建议)。然而,由于某个数字的位可能会延伸超过两个字节,因此会更复杂一些。

答案 1 :(得分:0)

Copy paste of documentation

  

<强>的ios_base&安培; oct(ios_base&amp; str);

     

使用八进制基础为 str 流设置 basefield 格式标志   到 oct

     

示例

// modify basefield
#include <iostream>     // std::cout, std::dec, std::hex, std::oct

int main () {
  int n = 70;
  std::cout << std::dec << n << '\n';
  std::cout << std::hex << n << '\n';
  std::cout << std::oct << n << '\n';
  return 0;
}
     

Output

70
46
106

所以,你要重新发明轮子。