2016-06-17 15 views
3

変数のビットを設定して、必要なパターンにする方法を教えてください。 例として、このシーケンスを印刷する必要がある場合、どうすればよいですか?ビット演算子を使用したパターン

11010010 11010010 11010010 11010010 

私が印刷したコードと、この構成では、別のビットを書いたが、私が望むようにそれらを設定する方法がわかりません。

#include <stdio.h> 
#include <limits.h> 
int a; 
void stampabit(a); 
int main() 
{ 
    int i; 
    int n= sizeof(int) * CHAR_BIT; 
    int mask = 1 << (n-1); 

    for (i=1; i<=n; ++i){ 
     putchar(((a & mask)==0)?'0':'1'); 
     a<<=1; 
     if(i%CHAR_BIT==0 && i<n) 
      putchar(' '); 
    } 
} 
+0

「a」と「マスク」は、m.s.に移動しているため、「符号なし」にする必要があります。ビット(そうでなければ符号ビット)。この場合、 'unsigned a = 0xd2d2d2d2;' –

+0

実装されていない関数 'void stampabit(a);'は 'unsigned stampabit(void);または' void stampbe(unsigned * a);である必要があります。あなたはしようとしている。おそらく、あなたは 'スタンプビート'を32回呼び出してビットを 'a'にします。 –

答えて

1

あなたは出力が

11010010 11010010 11010010 11010010 
なりたいと変数

#include <stdio.h> 
#include <limits.h> 
unsigned int a = 0xAA55AA55; 

int main() 
{ 
    size_t i; 
    unsigned int n= sizeof(int) * CHAR_BIT; 
    unsigned int mask = 1 << (n-1); 

    for (i=1; i<=n; ++i){ 
     putchar(((a & mask)==0)?'0':'1'); 
     mask>>=1; 
     if(i%CHAR_BIT==0 && i<n) 
      putchar(' '); 
    } 
    putchar('\n'); 
} 

出力がa0xD2D2D2D2の値を変更する

10101010 01010101 10101010 01010101 

なりマスクの代わりに、シフトをシフトする必要があります

+0

返事をありがとう。 0xAA55AA55を使用した理由 – ennedes

+0

グローバル変数が0に設定されているために表示する値を設定します。値自体はプロの変形です;) – LPs

+0

これは本当に便利です。私は必要なビットの価値をどのように見つけられますか? – ennedes

0

編集:

uint32_t a=1; 
a |= 0xD2D2D2D2 ; //set bits to 11010010 11010010 11010010 11010010 
a &= ~1; // clear first bit (or mask) 

、それは別に表示コードに良いです:あなたが必要な場合は
単にビット単位を使用するか、
とあなたには、いくつかのビットをクリアする必要がある場合は、ビット単位を使用して、いくつかのビットを設定します

:あなただけのいくつかのビット、単純にビット単位を使用するか、このように設定する必要がある場合

#include <stdio.h> 
#include <stdint.h> 

void print_bits(uint32_t u){ 
    int i=31; 
    do{ 
     if (u & 0x80000000) putchar('1'); else putchar('0'); 
     u <<= 1; 
     if(i%8 == 0) putchar(' '); 
    }while(--i >= 0); 
} 

int main(){ 
    uint32_t a=1; 
    a |= 0xD2D2D2D2 ; //set bits to 11010010 11010010 11010010 11010010 
    a &= ~1; // clear first bit (or mask) 
    print_bits(a); //output: 11010010 11010010 11010010 11010010 
} 

旧:明確なコードを持っているメインコード

stampabit(0xD2D2D2D2); // stampabit(0b11010010110100101101001011010010); 

作業例:

#include <stdio.h> 
#include <limits.h> 
//#include <stdint.h> 
int a=0; 
void stampabit(int setBits){ 
    a |= setBits; 
} 
int main() 
{ 
    int i; 
    stampabit(0xD2D2D2D2); // stampabit(0b11010010110100101101001011010010); 
    int n= sizeof(int) * CHAR_BIT; // number of bits in int (8, 16, 32, 64, ... bits) 
    int mask = 1 << (n-1); // sign bit mask 

    for (i=1; i<=n; ++i){ 
     putchar(((a & mask)==0)?'0':'1'); 
     a<<=1; 
     if(i%CHAR_BIT==0 && i<n) 
      putchar(' '); 
    } 
} 

出力:

11010010 11010010 11010010 11010010 

いくつかの注意:
ここでそれだけでこれはあなたのパターン11010010 11010010 11010010 11010010使用を設定する

サンプルコードとそれは正常に動作しますが、符号なしの型を使用するのはclです早期にサインビットが必要ないことを示し、バグプルーフです。
ローカル変数を使用するか、ローカル変数をシフトする方が、意図的な場合を除き、グローバル変数を使用またはシフトするよりも優れています。

少なくとも最後のではなく、あなたが

#include <stdint.h> 

からプラットフォーム依存のint利用int32_tかのuint32_tを必要としない場合、あなたは、いくつかのビットをクリアする必要がある場合は、ビット単位を使用して:

uint32_t a=1; 
a |= 0xD2D2D2D2 ; //set bits to 11010010 11010010 11010010 11010010 
a &= ~1; // clear first bit (or mask) 

私はお役に立てれば。

+0

Cにバイナリリテラル '0b ...'がありません。 – interjay

+0

私はDev-Cppを使用しています。これはサポートしています。あなたの場合は16進値を使用してください。 –

+0

Dev-cppはIDEであり、コンパイラではありません。あなたのコンパイラ(おそらくGCC)はそれを拡張としてサポートしますが、標準ではありません。 – interjay

関連する問題