C++ 将整数转换为位
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/6038718/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Convert integer to bits
提问by parc65
I have byte to binary string function,
我有字节到二进制字符串的函数,
std::string byte_to_binary(unsigned char byte)
{
int x = 128;
std::ostringstream oss;
oss << ((byte & 255) != 0);
for (int i = 0; i < 7; i++, x/=2)
oss << ((byte & x) != 0);
return oss.str();
}
How can i write an int to bits in same way? I don't want extra 0's at the beginning of binary string so that is why i can't figure out how to create a variable length each time. Also, i'm not using std::bitset.
如何以相同的方式将 int 写入位?我不希望在二进制字符串的开头有额外的 0,这就是为什么我每次都无法弄清楚如何创建可变长度。另外,我没有使用 std::bitset。
回答by Xeo
I'll just post this as an answer. It is shorter, safer and, what's most important, it is done.
我只是将其作为答案发布。它更短,更安全,最重要的是,它已经完成。
#include <string>
#include <bitset>
#include <type_traits>
// SFINAE for safety. Sue me for putting it in a macro for brevity on the function
#define IS_INTEGRAL(T) typename std::enable_if< std::is_integral<T>::value >::type* = 0
template<class T>
std::string integral_to_binary_string(T byte, IS_INTEGRAL(T))
{
std::bitset<sizeof(T) * CHAR_BIT> bs(byte);
return bs.to_string();
}
int main(){
unsigned char byte = 0x03; // 0000 0011
std::cout << integral_to_binary_string(byte);
std::cin.get();
}
Output:
输出:
00000011
00000011
Changed function name, though I'm not happy with that one... anyone got a nice idea?
更改了函数名称,尽管我对那个不满意……有人有好主意吗?
回答by Pablo
Something like this should work (though I hacked it up quickly and haven't tested):
像这样的东西应该可以工作(虽然我很快就破解了它并且没有测试过):
#include <string>
#include <climits>
template<typename T>
std::string to_binary(T val)
{
std::size_t sz = sizeof(val)*CHAR_BIT;
std::string ret(sz, ' ');
while( sz-- )
{
ret[sz] = '0'+(val&1);
val >>= 1;
}
return ret;
}
回答by shirvind
You can do it using std:bitset and convert any number into bit string of any size, for example 64
您可以使用 std:bitset 并将任何数字转换为任何大小的位串,例如 64
#include <string>
#include <iostream>
#include <bitset>
using namespace std;
int main() {
std::bitset<64> b(836); //convent number into bit array
std::cout << "836 in binary is " << b << std::endl;
//make it string
string mystring = b.to_string<char,char_traits<char>,allocator<char> >();
std::cout << "binary as string " << mystring << endl;
}
回答by Jan Turoň
Since you mentioned your wish for C style in the comments, you might consider using itoa(or _itoa) if you are not worried about ANSI-C standard. Many compilers support it in stdlib.h. It also strips the leading 0's:
由于您在评论中提到了您对 C 风格的希望,如果您不担心 ANSI-C 标准,您可以考虑使用itoa(或 _itoa)。许多编译器在 stdlib.h 中支持它。它还去除前导 0:
unsigned char yourGoldenNumber = 42;
char binCode[64];
itoa(yourGoldenNumber,binCode,2); // third parameter is the radix
puts(binCode); // 101010