使用位运算符将十进制转换为八进制
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 所建议)。但是,这会涉及更多,因为某个数字的位可能会超过两个字节。
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;
}
70
46
106
所以归根结底,你是在重新发明轮子。
以下函数旨在将其参数(整数)从十进制转换为八进制。
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 所建议)。但是,这会涉及更多,因为某个数字的位可能会超过两个字节。
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; }
70 46 106
所以归根结底,你是在重新发明轮子。