2進化10進数 vs 2進数
2進化10進数と2進数のバイナリでの'1'の数をカウントし、
数が同じであるかを判定するプログラムを書いてみました。
例えば、34という数は、
2進化10進数では'3'と'4'をそれぞれバイナリで表し
結合するため、'0011 0100'となり、
2進数では'0010 0010'となります。
'1'の数をカウントすると、3個と2個でマッチしないということです。
1 #include<stdio.h> 2 int main() { 3 int num; 4 while(scanf("%d", &num) != EOF) { 5 int binary_cnt = 0, decimal_cnt = 0, i; 6 for(i = 0; i < 8; i++) { 7 if ((num>>i)%2) binary_cnt++; 8 if (i<4 ? (num%10>>i)%2 : (num/10>>i-4)%2) 9 decimal_cnt++; 10 } 11 puts(decimal_cnt==binary_cnt ? "Match!!" : "Not Match!!"); 12 } 13 return 0; 14 }
ショートコーディングのため、大変見にくいですが、ご容赦ください。
7行目で2進数の'1'の数をカウントしています。
これは、1bitずつシフトさせているだけの単純な作業です。
8行目は、iが4未満であれば、1の位のバイナリの'1'の数をカウントし、
iが4以上であれば、10の位のバイナリの'1'の数をカウントしています。
三項演算子を使用しています。
時間があれば、汎用化をしてみます。
また、binary_cntとdecimal_cntの2つの変数を使って、カウントしていますが、
count変数を1つにもできるのではないかと考えています。