2016-03-29 8 views
-4
int main() 
{ 
    double hexa_number; 
    double bitmask = 0x80; 
    double i; 
    printf("Enter 8 bit number in hexadecimal form: "); 
    scanf("%lf",& hexa_number); 
    for(i = 0; i <= 8; i++) 
    { 
     if(hexa_number&(bitmask >> i)) 
      printf("1"); 
     else 
      printf("0"); 
    } 
    return 0; 
} 

を用いて加え、この数のバイナリ表現を表示するバイナリに16進数を変換することができ、2進数で0と1の数のカウントとともに 。 ビットマスクを使用して変換する方法は他にもありますが、ビットマスクは使用しません。がどのようにビットマスク

+0

任意のヘルプしてください –

+0

のC#には、 'printf'はありませんので、私はCではなく、C#のようにこれを再びタグ付けしました。 –

答えて

0

ビットマスクには2倍の値を使用している可能性があります。私は二重については特に意味がありません。なぜなら、それらが符号ビット、仮数および2 ^指数で構成されているからです。例えば

、我々は簡単にするため、符号なし2台のバイトフロートを想像すると、最初のバイトが仮数を表すことを想像する場合>> 1 8 2

除算と同様、いい一貫した操作であると4です。 2番目の指数(両方とも符号なし)の場合、7 * 2^4(= 112)は0b00000111 00000100として表すことができます。その1を右に>> 1移動すると、0b00000011 10000010が得られます。これは、 3 * 2^130になりました。浮動小数点をビットシフトしてみると、私のコンパイラは "エラー:2進数に無効なオペランド(2進数と符号なし)"というエラーを出します。数。

だから、基本的に次のことを試みることができる:

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int hexa_number = 0; 
    unsigned num_bits = sizeof(int)*8; 
    unsigned bitmask = 1 << (num_bits - 1); 
    printf("Enter a number in hexadecimal form: "); 
    scanf("%i", &hexa_number); 

    unsigned k = 0; 
    unsigned num_ones = 0; 
    unsigned num_zeros = 0; 

    for(k = 0; k != num_bits; k ++) 
    { 
     if(hexa_number & (bitmask >> k)) 
     { 
      printf("1"); 
      num_ones ++; 
     } 
     else 
     { 
      printf("0"); 
      num_zeros++; 
     } 
    } 
    printf("\nNumber of ones is %i\nNumber of zeros is %i", num_ones, num_zeros); 
    return 0; 
} 
+0

たくさん助けてくれてありがとう、ロキタンスキー。 –