7

整数をバイナリ文字列に変換し、整数文字列の各ビットを特定のサイズの整数配列の要素に格納したいと考えています。入力整数のバイナリ表現が、指定された配列のサイズを超えないことを確信しています。C ++でこれを行う方法は?

4

8 に答える 8

12

擬似コード:

int value = ????  // assuming a 32 bit int
int i;

for (i = 0; i < 32; ++i) {
    array[i] = (value >> i) & 1;
}
于 2012-12-31T17:14:17.947 に答える
6
template<class output_iterator>
void convert_number_to_array_of_digits(const unsigned number, 
         output_iterator first, output_iterator last) 
{
    const unsigned number_bits = CHAR_BIT*sizeof(int);
    //extract bits one at a time
    for(unsigned i=0; i<number_bits && first!=last; ++i) {
        const unsigned shift_amount = number_bits-i-1;
        const unsigned this_bit = (number>>shift_amount)&1;
        *first = this_bit;
        ++first;
    }
    //pad the rest with zeros
    while(first != last) {
        *first = 0;
        ++first;
    }
}

int main() {
    int number = 413523152;
    int array[32];
    convert_number_to_array_of_digits(number, std::begin(array), std::end(array));
    for(int i=0; i<32; ++i)
        std::cout << array[i] << ' ';
}

コンパイルの証明はこちら

于 2012-12-31T17:16:50.213 に答える
5

次のように、 C++ のビットセット ライブラリを使用できます。

#include<iostream>
#include<bitset>

int main()
{
  int N;//input number in base 10
  cin>>N;
  int O[32];//The output array
  bitset<32> A=N;//A will hold the binary representation of N 
  for(int i=0,j=31;i<32;i++,j--)
  {
     //Assigning the bits one by one.
     O[i]=A[j];
  }
  return 0;
}

ここで注意すべき点がいくつかあります。まず、bitset 宣言ステートメントの 32 は、数値を 32 ビットで表現することをコンパイラーに伝えます。多くの先行ゼロ。次に、bitset はバイナリを非常に柔軟に処理する方法です。文字列を入力または数値として指定でき、またビットセットを配列または文字列として使用できます。これは非常に便利なライブラリです。ビットセット変数 A を出力して、 cout<<A; それがどのように機能するかを確認できます。

于 2012-12-31T17:30:30.207 に答える
2

次のようにできます。

while (input != 0) {

        if (input & 1)
            result[index] = 1; 
        else
            result[index] =0;
   input >>= 1;// dividing by two
   index++;
}
于 2012-12-31T17:16:29.890 に答える
1

10 進数から 2 進数へ: サイズに依存しない

2 つの方法: どちらもバイナリ表現を動的に割り当てられた配列bits(msh から lsh) に格納します。

最初の方法:

#include<limits.h> // include for CHAR_BIT
int* binary(int dec){
  int* bits = calloc(sizeof(int) * CHAR_BIT, sizeof(int));
  if(bits == NULL) return NULL;
  int i = 0;

  // conversion
  int left = sizeof(int) * CHAR_BIT - 1; 
  for(i = 0; left >= 0; left--, i++){
    bits[i] = !!(dec & ( 1u << left ));      
  }

  return bits;
}

2 番目の方法:

#include<limits.h> // include for CHAR_BIT
int* binary(unsigned int num)
{
   unsigned int mask = 1u << ((sizeof(int) * CHAR_BIT) - 1);   
                      //mask = 1000 0000 0000 0000
   int* bits = calloc(sizeof(int) * CHAR_BIT, sizeof(int));
   if(bits == NULL) return NULL;
   int i = 0;

   //conversion 
   while(mask > 0){
     if((num & mask) == 0 )
         bits[i] = 0;
     else
         bits[i] = 1;
     mask = mask >> 1 ;  // Right Shift 
     i++;
   }

   return bits;
}
于 2013-01-14T07:14:37.053 に答える
1

上記の Mat のように、 anintは既にビットベクトルです (ビット演算を使用すると、各ビットを確認できます)。したがって、次のようなことを簡単に試すことができます。

// Note: This depends on the endianess of your machine
int x = 0xdeadbeef; // Your integer?
int arr[sizeof(int)*CHAR_BIT];
for(int i = 0 ; i < sizeof(int)*CHAR_BIT ; ++i) {
  arr[i] = (x & (0x01 << i)) ? 1 : 0; // Take the i-th bit
}
于 2012-12-31T17:15:41.867 に答える
0

正の数に必要な数のゼロを追加しないことはわかっています。しかし、負の2進数の場合、それはかなりうまく機能します..一度だけ解決策を投稿したかっただけです:)

int BinToDec(int Value, int Padding = 8)
{
    int Bin = 0;

    for (int I = 1, Pos = 1; I < (Padding + 1); ++I, Pos *= 10)
    {
        Bin += ((Value >> I - 1) & 1) * Pos;
    }
    return Bin;
}
于 2012-12-31T18:37:18.147 に答える