1

ビット単位とビットシフトを使用して数値をバイナリで出力する関数を作成しようとしていますが、正しく出力できません。以下は私のコードです。

void PrintInBinary( unsigned int decNum )
{
    int i = 0;
    unsigned int highestOne = 1 << (sizeof(unsigned int)*8 - 1);

    for( i = 0; i < sizeof(int)*8; i++ ) {
         printf( "%u", decNum & (highestOne >> i) );
    }
    printf("\n");
}


int main()
{
    unsigned int a = 128;
    PrintInBinary( a );
    system("PAUSE");
    return 0;
}

出力は次のとおりです。

0000000000000000000000001280000000

基本的に、各ビット位置で 1 だけではなく 2^bit を出力します (たとえば、7 をバイナリに変換したい場合は、0000000...00111 ではなく 0000000...00421 になります)。これはおそらく私が見逃している些細なことですが、助けてくれる人はいますか? 私はこの20分間、これほど単純なことを理解できませんでした。

4

7 に答える 7

3

に変更decNum & (highestOne >> i)(decNum & (highestOne >> i)) != 0ます。

多くの人も書くのが好き!!(decNum & (highestOne >> i))です。かわいいのは認めますが、読みにくいので、これを使用しないことをお勧めします。

于 2012-04-25T18:49:23.427 に答える
2
void PrintInBinary( unsigned int decNum )
{

    unsigned int bit;

    for( bit = 1u << (CHAR_BIT*sizeof bit -1); bit; bit >>= 1 ) {
         printf( "%c", decNum & bit ? '1' : '0' );
    }
    printf("\n");
}
于 2012-04-25T19:04:19.133 に答える
1

arr を保存したい場合は、次の関数をお勧めします。

unsigned int decNum を取得してバイナリに変換する次の関数を見てみましょう。

/*#define BITS 8*/
int size = sizeof(unsigned int)*BITS;

char arr[size] ;

int i;
/* 
    now lets thinkk...

    shift by i=0 to the right:
    4 = 00...00 0100 &
    1 = 00...00 0001
    -----------------
        00...00 0000
    now we know that we need to enter 0 in the 1-rd place in the arr

    shift by i=1 to the right:
    4 = 00...00 0010 &
    1 = 00...00 0001
    -----------------
        00...00 0000
    now we know that we need to enter 0 in the 2-rd place in the arr

    shift by i=2 to the right:
    4 = 00...00 0001 &
    1 = 00...00 0001
    -----------------
        00...00 0001
    now we know that we need to enter 1 in the 3-rd place in the arr

    and so on...

 */
    for(i=0; i<size; ++i) {
         int shifted = (decNum >> i);
         arr[(size-1)-i] = (shifted&1)?'1':'0';
    }

printf("The binary of %d in %d bits:\n",decNum, size);

/*now lets print the array*/
for (i=0; i < size ; i++){
         printf("%c",arr[i]);
}
printf("\n");
于 2013-04-18T11:35:02.353 に答える
1

使用する

printf( "%u", decNum & (highestOne >> i) > 0 ? 1 : 0 );
于 2012-04-25T18:52:02.763 に答える
1

それは確かにマークによって提案された変更でそれを行う1つの方法ですが、この方法ははるかに読みやすいと思います:

unsigned int decNum = 7;

for(i = 0; i < sizeof(int)*8; i++ ) 
{
  printf("%u", ((decNum >> i) & 1));
}
printf("\n");
于 2012-04-25T18:58:07.197 に答える
0
#include"stdio.h"
#include"conio.h"//this coding f

void main()
{
    int rm,vivek;
    clrscr();
    printf("enter the values");
    scanf("%d",&rm);
    printf("enter the no.of times moves");
    scanf("%d",&vivek);
    printf("the value rm=%d>>vivek=%doutput=%u",rm,vivek,rm>>vivek);//5>>1
    getch();
}
于 2014-09-23T11:14:18.917 に答える
0

decNum & (highestOne >> i)評価をするだけです。評価が である場合は、else である場合trueは print を出力する必要があります。1false0

decNum & (highestOne >> i) ? 1 : 0

注: OTOH、8 のようなマジック ナンバーの使用は避けてください。

于 2012-04-25T18:54:59.310 に答える