アフィリエイト広告を利用しています

広告

posted by fanblog

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';
}
}
}

d02_04.png


新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/11/10 13:13時点)

新版 明解C 中級編 (明解シリーズ)

新品価格
¥2,916から
(2017/11/10 13:14時点)





この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/6965069
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2018年08月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。