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

Converting Decimal to Octal Using Bitwise Operators

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

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 它 returns 77777777777,当它应该 return 37777777777,所以第一个数字必须是 3 而不是 7。为什么会这样?对于所有负输入,该功能似乎都不正确。我如何调整算法,使其 return 对于负数正确?

注意:这是一个 CS 作业,所以我很感激hints/tips。

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

(((unsigned int)num) >> 3*i) & 7


更进一步,您可以使函数模板化并将指向输入的指针转换为 uint8_t*,使用 sizeof 计算八进制数字的个数(如 DanielH 所建议)。但是,这会涉及更多,因为某个数字的位可能会超过两个字节。

Copy paste of documentation

ios_base& oct (ios_base& str);

Use octal base Sets the basefield format flag for the str stream to oct.

Example

// 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

所以归根结底,你是在重新发明轮子。