I made an application that deals with some bit operations. Guess it's downright interesting.
If you're unfamiliar with bit operations, I recommend you try the application below.
どうやら、アメリカからもアクセスがあるみたいなので、ちょっとだけ英語でも書いてみました。
今日はビット演算がテーマです。
世の変態天才プログラマーたちは、ビット演算を巧みに扱います。ビット演算の魔術師と言っても過言ではありません。
私も最近ビット演算のすごさに気付きました。ビットというのは2進数なのでいろいろなことに使えます。例えばバイナリサーチの応用のようなこと(※)もビット演算で出来ます。
(※ 「のようなこと」と書いたのは少なくとも私のイメージではという意味です。0か1かを常に2つに1つの可能性を選んでデータを構築していて、探索時はO(log n)で出来るという意味です。詳しくは「ビット演算を用いたべき乗計算の高速化」参照のこと。)
『ビット演算を制するものはプログラムを制する!』
『そうか、ビット演算を使えば、コードの量も1/2になり、実行速度も2倍になる。
つまり、おれがビット演算を使えば、その働きは4倍っていうことか!!!』
桜木花道もびっくり@_@
ちょっと話が脱線しましたが、下がソースです。
ビット演算初心者向けです。かなり基本ですが動きを自分で見て確認するにはいいかと。。
あと、どのような演算を施すと何が起きるのかをしっかり把握できます。一度自分で同じようなものを作ってみるといいでしょう。
- void getBin(int n, char bin[]) {
- REP (i, 16)
- bin[15 - i] = (n >> i & 1) + '0';
- bin[16] = '\0';
- }
- int main() {
- int n, bit;
- char calc, bin[16 + 1];
- cout << "Input an integer." << endl;
- cin >> n;
- getBin(n, bin);
- printf("%s\n", bin);
- // Input one of the manipulations below:
- // q exit
- // u bit change bit-th bit to '1'
- // d bit change bit-th bit to '0'
- // x bit reverse bit-th bit
- // c reverse all bits
- // where q, u, d, x and c are characters themselves, bit is an integer and 0-based.
- while (cin >> calc) {
- switch (calc) {
- case 'q':
- cout << "Bye!" << endl;
- return 0;
- case 'u':
- cin >> bit;
- n |= 1 << bit;
- break;
- case 'd':
- cin >> bit;
- n &= ~(1 << bit);
- break;
- case 'x':
- cin >> bit;
- n ^= 1 << bit;
- break;
- case 'c':
- n = ~n;
- break;
- default:
- cerr << "Syntax Error." << endl;
- cerr << "Try again." << endl;
- continue;
- }
- getBin(n, bin);
- printf("%s\n", bin);
- }
- return 0;
- }
0 件のコメント:
コメントを投稿