No.3ベストアンサー
- 回答日時:
==================================
「Cアンサー・ブック 啓学出版」より
==================================
解答
bitcount(n)
unsigned n;
{
int b;
for(b=0; n!=0; n&=n-1)
++b;
return(b)
}
x-1の値の例として2進で1010(10進で10)を考えてみましょう。(x-1)+1はxになります。
2進 10進
1010 x-1 10
+ 1 + 1
---- ----
1011 x 11
2進数においては、x-1に1を加えた場合、x-1のもっとも右の0ビットがxにおいて1となります。したがって、xのもっとも右の1のビットに対応するx-1のビットは0となります。これが2の補数を用いている数において、x&(x-1)がもっとも右の1のビットをクリアする理由です。
4ビットの符号なしの数を考えてみましょう。この数のすべての1のビットを数えるために、もとのbitcountではもっとも右のビットを調べるために4回のシフトを行っていますが、代わりに、"x&(x-1)がxのもっとも右のビットをクリアする"という知識を使うことができます。例として、xを9としてみましょう。
1001 2進であらわした9 (x)
1000 2進であらわした8 (x-1)
----
1000 x&(x-1)
もっとも右の1のビットがクリアされています。結果の値は、2進で1000、10進で8となります。さらに同じことを繰り返します。
1000 2進であらわした8 (x)
0111 2進であらわした7 (x-1)
----
0000 x&(x-1)
ここでももっとも右の1ビットがクリアされます。結果の値は、2進で0000、10進で0です。もうxには1のビットがないので、プロセスは終了します。
もっとも条件のの悪い場合、すなわちxのすべてのビットが1の場合、ANDを行う数はもとのbitcountのシフト数と同じです。結局、こちらのほうが速いバージョンであるといえます。
No.2
- 回答日時:
例えば、
xとして、奇数の5と偶数の6の場合を考えてみます
x-1の2進表現は(4と5)
100と101です。
ここで、+1してみることを考えると
100,101
001,001<+する
101,110になります。
これは、キャリーの生じる生じない場合に依って
一番右側の0を1にするということになります。
(0に+1しても桁上げが生じないが1の場合桁上げするから)
このことは、逆に言うとxの一番右側の1のビットに対応するx-1のビットは、0になるということです。
1の補数系ではx-1+1がxにならない場合があるということだと思います。
この回答へのお礼
お礼日時:2005/06/03 10:49
解答していただき、どうもありがとうございました。
でも、「x-1+1がxにならない場合がある」ということは、1の補数系で計算するのって大変だなって思っちゃいました、単純に。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelVBAで、index、match関数を使用して、指定範囲に出力したい 3 2022/10/18 21:53
- 数学 以前ローラン展開において質問して回答をいただいたのですが、その回答について疑問がございます。 「i) 20 2022/06/25 11:13
- 数学 有限生成環から体へのC代数準同型写像についての質問 1 2023/03/08 12:15
- 高校 存在命題の基本的な質問 1 2022/04/19 14:32
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- 高校 述語論理の基本的な質問 3 2022/04/23 10:35
- C言語・C++・C# C言語 3 2022/10/04 15:07
- 物理学 xy平面上の点A(-3,4)に2[C]の点電荷、点B(2,0)に-1[C]の点電荷が置かれている。 1 2023/08/12 23:15
- 数学 f(z)=1/(z^2-1)の時、 i) 0<r<2 C={z||z-1|=r} の時は a(n)= 7 2022/09/01 10:08
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
0xffffとは?
-
エクセルVBAのIf,Then 構...
-
8ビットのデータの、先頭ビット...
-
[VBS] 素早くローテート演算したい
-
PLC 命令について
-
一般のソフトで画像を扱う場合...
-
三菱 シーケンサー
-
16ビットCPUで32ビットの計算方法
-
アセンブリの論理演算命令のCPL...
-
ビットシフトってどんな時使うの?
-
ブール代数で解き方がわかりません
-
CASL2(減算命令と比較命令の...
-
文字参照は10進数と16進数では...
-
CASLIIのCPLとCPAについて
-
シーケンサープログラム
-
03分22秒36のような時間の単位...
-
PS3に搭載されている"Cell"は、...
-
2の補数
-
パソコンに使われているn進法は...
-
この画像の命令「CMP k300 D0 M...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0xffffとは?
-
エクセルVBAのIf,Then 構...
-
8ビットのデータの、先頭ビット...
-
情報科学の飽和演算、ラップア...
-
ビットシフトってどんな時使うの?
-
一般のソフトで画像を扱う場合...
-
文字参照は10進数と16進数では...
-
スロースキャンコンピュータ 加...
-
C言語で128bitの2進数のビット...
-
命令について
-
シーケンス制御についての質問...
-
03分22秒36のような時間の単位...
-
verilog 符号付加減算(最上位...
-
[VBS] 素早くローテート演算したい
-
CASLIIでかけ算
-
符号無し整数xを右にnビット回転
-
算術シフト演算が成り立つ理由...
-
PLC 命令について
-
二元対称無記憶通信路を実現す...
-
2の補数
おすすめ情報