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

広告

posted by fanblog

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

d02_03.png


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

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

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

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





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

お名前:

メールアドレス:


ホームページアドレス:

コメント:

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

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

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

 たまに、クリック お願いします 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日以上新しい記事の更新がないブログに表示されております。