将整数转换为位

时间:2011-05-18 00:43:10

标签: c++ bitwise-operators bits

我有字节到二进制字符串函数,

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();
}

如何以相同的方式将int写入位?我不希望在二进制字符串的开头有额外的0,所以这就是我无法弄清楚每次如何创建变量长度的原因。 另外,我没有使用std :: bitset。

4 个答案:

答案 0 :(得分:9)

我会发布这个作为答案。它更短,更安全,最重要的是, 已完成

#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();
}

输出:

  

00000011

更改了功能名称,虽然我对那个不满意......任何人都有个好主意?

答案 1 :(得分:5)

这样的事情应该有用(虽然我很快就把它搞砸了并且没有经过测试):

#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;
}

答案 2 :(得分:2)

您可以使用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;
}

答案 3 :(得分:1)

由于您在评论中提到了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