将整数转换为位

新手上路,请多包涵

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

 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。

原文由 parc65 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 681
2 个回答

我只是将其发布为答案。它更短、更安全,而且最重要的是,它已经 完成了

 #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

更改了函数名称,尽管我对那个不满意……有人有个好主意吗?

原文由 Xeo 发布,翻译遵循 CC BY-SA 3.0 许可协议

像这样的东西应该可以工作(尽管我很快就破解了它并且没有测试过):

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

原文由 Pablo 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏