2017年11月13日
《その123》 特定の 1ビットだけを操作する & p.55演習2-3
特定の 1ビットだけを操作する方法を考えてみます。
操作は次の3種類です。
@ 1 をセットする。
A 0 をセットする。
B 反転する。
【 @の場合 】
@の例として、
00000000000000000000000000000111 … (@)
の下位第 5ビットに 1をセットする場合について考えてみます。
下位第 5ビットだけが 1 の
00000000000000000000000000010000 … (A)
を用意します。
(@)と(A)の論理和「 | 」が、求める結果です。
00000000000000000000000000000111 … (@)
|) 00000000000000000000000000010000 … (A)
-------------------------------------
00000000000000000000000000010111 … 完成
【 Aの場合 】
00000000000000000000000000000111 … (@)
の下位第 2ビットに 0をセットする場合について考えてみます。
下位第 2ビットだけが 1 の
00000000000000000000000000000010 … (B)
を用意します。
(B)の全ビットを反転させます。
11111111111111111111111111111101 … (C)
(@)と(C)の論理積「 & 」が、求める結果です。
00000000000000000000000000000111 … (@)
&) 11111111111111111111111111111101 … (C)
-------------------------------------
00000000000000000000000000000101 … 完成
【 Bの場合 】
00000000000000000000000000000111 … (@)
の下位第 4ビットを反転する場合について考えてみます。
下位第 4ビットだけが 1 の
00000000000000000000000000001000 … (D)
を用意します。
(@)と(D)の排他的論理和「 ^ 」が、求める結果です。
00000000000000000000000000000111 … (@)
^) 00000000000000000000000000001000 … (D)
-------------------------------------
00000000000000000000000000001111 … 完成
新版明解C++中級編 p.55 演習2-3
符号無し整数 x の下位第 posビットを、1 にした値を返す関数 set、0 にした値を返す関数 reset、反転した値を返す関数 inverse を作成せよ。
unsigned set( unsigned x, int pos);
unsigned reset( unsigned x, int pos);
unsigned inverseset(unsigned x, int pos);
// p55_演習2-3
#include <iostream>
using namespace std;
int count_bits(unsigned x) {
int bits = 0;
while (x) {
if (x & 1U) bits++;
x >>= 1;
}
return bits;
}
int int_bits() { return count_bits(~0U); }
void print_bits(unsigned x) {
for (int i = int_bits() - 1; i >= 0; i--)
cout << ((x >> i) & 1U ? '1' : '0');
}
unsigned set(unsigned x, int pos) {
unsigned temp = 1U;
for (int i = 1; i < pos; i++) temp *= 2;
return x | temp;
}
unsigned reset(unsigned x, int pos) {
unsigned temp = 1U;
for (int i = 1; i < pos; i++) temp *= 2;
temp = ~temp;
return x & temp;
}
unsigned inverse(unsigned x, int pos) {
unsigned temp = 1U;
for (int i = 1; i < pos; i++) temp *= 2;
return x ^ temp;
}
int main() {
unsigned x;
while (1) {
cout << "非負の整数(999で終了) : "; cin >> x;
if (x == 999) break;
print_bits(x); cout << ' ' << x << '\n';
int pos;
do { cout << "対象は下位第何ビット(1 〜 " << int_bits() << ")ですか : ";
cin >> pos; } while (pos < 1 || pos > int_bits());
int n;
do { cout << "1 … set, 2 … reset, 3 … inverse 番号を入力 : ";
cin >> n; } while (n != 1 && n != 2 && n != 3);
print_bits(x); cout << ' ' << x << '\n';
if (n == 1) {
unsigned return_value = set(x, pos);
print_bits(return_value); cout << ' ' << return_value << '\n';
}
if (n == 2) {
unsigned return_value = reset(x, pos);
print_bits(return_value); cout << ' ' << return_value << '\n';
}
if (n == 3) {
unsigned return_value = inverse(x, pos);
print_bits(return_value); cout << ' ' << return_value << '\n';
}
cout << '\n';
}
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6964126
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック