Memorandums?

This blog is written about technical-discovery and daily-event.

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つにもできるのではないかと考えています。