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

问题描述 投票:1回答:2

以下功能意在它的参数,整数转换,从十进制到八进制。

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的分配,所以我会很感激的提示/提示。

c++ octal base-conversion
2个回答
2
投票

这是因为算术移位保留数的符号。为了克服这一点,首先投射到等效无符号类型的输入整数。

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


进一步说,可以使模板的功能和转换指针到输入uint8_t*,使用sizeof计算的八进制数字的号码(由DanielH的建议)。然而,这将是一个比特更多地参与作为比特一定位数的可上伸展的两个字节。


0
投票

Copy paste of documentation

的ios_base&辛(的ios_base&STR);

使用八进制基地设置的STR流至10月则baseField格式标志。

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

因此,底线你重新发明轮子。

© www.soinside.com 2019 - 2024. All rights reserved.