8

バイトからバイナリ文字列への関数がありますが、

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

4 に答える 4

13

これを答えとして投稿します。それはより短く、より安全であり、そして最も重要なことは、それが行われることです。

#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

関数名を変更しましたが、私はそれに満足していません...誰かがいいアイデアを思いついたのですか?

于 2011-05-18T01:18:05.690 に答える
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;
}
于 2011-05-18T00:47:44.263 に答える
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
于 2014-12-08T23:28:08.373 に答える