変数のビット配列を見てみたいと思い書いた。
print_bits.c(主要関数部)
#include <stdio.h>
void printbits(unsigned char v) {
int i; // for C89 compatability
for(i = 7; i >= 0; i--) putchar('0' + ((v >> i) & 1));
}
void printbits_int(int v) {//for 32bit variable
int i,j;
for(i=8*sizeof(int)-1; i >= 0; ) {
for(j=4; j>0; j--) {
putchar('0' + ((v >> i) & 1));
i--;
}
putchar(' ');
}
}
実行結果
$ gcc print_bits.c -o printbits
$ ls
printbit.exe printbits.c
$ ./printbit.exe
This program enable you to see bit of variable.
Ener one character you want see its bit(= ascii code).
R
01010010
Ener variable(int) you want see its bit.
43690
1010 1010 1010 1010
しくみ
1.ビットシフトで1ビットずつビットAND演算
変数vの中身を一番左端から0なのか1なのか見ていきます。
ビットの中身が0なら((v >> i) & 1)は0b00...000(=0)に、1なら0b00..001(=1)になります。(「0b」はビット表現の意味です。)
//char v='z' z=0b01111010
((v >> 7) & 0b00000001)//=0 先頭ビットは0
((v >> 6) & 0b00000001)//=1 次のビットは1
...
2.「0」の文字コードに0か1を加えて「0」か「1」を出力
putchar('0')で当然0を出力するわけですが、その'0'に1を加えると'1'を表す文字コードになることを利用します。
putchar('0' + 1);//"1"
putchar('0' + 0);//"0"
putchar('a' + 1);//"b"