2017年11月13日
《その124》 ビットの数え方 & p.55演習2-4
ビットは下位から数えるのが普通だそうです。
その数え方ですが・・・
00110101
↑↑↑
||第0ビット
||
|第1ビット
|
第2ビット
と数えるのが一般的みたいですね。
00110101
↑↑↑
||第1ビット
||
|第2ビット
|
第3ビット
というのも有りだそうです。
自分はその辺りのことは深く考えたことが無かったので、ここまでの説明や解答は、
00110101
↑↑↑
||下位第1ビット
||
|下位第2ビット
|
下位第3ビット
という数え方を使っていました。
違う数え方の人は、そこの箇所は読み換えてくださるようにお願いします m(_ _)m
新版明解C++中級編 p.55 演習2-4
符号無し整数 x の下位第 posビットから第 pos + n - 1 ビットまでの n個のビットを、1 にした値を返す関数 set_n、0 にした値を返す関数 reset_n、反転した値を返す関数 inverse_n を作成せよ。
unsigned set_n( unsigned x, int pos, int n);
unsigned reset_n( unsigned x, int pos, int n);
unsigned inverseset_n(unsigned x, int pos, int n);
// p55_演習2-4
#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_n(unsigned x, int pos, int n) {
unsigned temp;
while (n--) {
temp = 1U;
for (int j = 1; j < pos; j++) temp *= 2;
x |= temp;
++pos;
}
return x;
}
unsigned reset_n(unsigned x, int pos, int n) {
unsigned temp;
while (n--) {
temp = 1U;
for (int j = 1; j < pos; j++) temp *= 2;
temp = ~temp;
x &= temp;
++pos;
}
return x;
}
unsigned inverse_n(unsigned x, int pos, int n) {
unsigned temp;
while (n--) {
temp = 1U;
for (int j = 1; j < pos; j++) temp *= 2;
x ^= temp;
++pos;
}
return x;
}
int main() {
unsigned x;
int pos, n, menu;
while (1) {
cout << "非負の整数(999で終了) : "; cin >> x;
if (x == 999) break;
print_bits(x); cout << ' ' << x << '\n';
cout << "操作開始は第何ビット(1 〜 " << int_bits() << ")か : ";
cin >> pos;
cout << "操作対象のビット数(" << "1 〜 "
<< int_bits() - pos + 1 << ") : ";
cin >> n;
cout << "1 … set,2 … reset,3 … inverse 番号を入力 : ";
cin >> menu;
print_bits(x); cout << ' ' << x << '\n';
if (menu == 1) {
unsigned b = set_n(x, pos, n);
print_bits(b); cout << ' ' << b << '\n';
}
if (menu == 2) {
unsigned b = reset_n(x, pos, n);
print_bits(b); cout << ' ' << b << '\n';
}
if (menu == 3) {
unsigned b = inverse_n(x, pos, n);
print_bits(b); cout << ' ' << b << '\n';
}
}
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6965069
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック