12

私はその結果を知っており、理解しています。

例えば:

<br>
 7 (decimal) = 00000111 (binary) <br>

and 7 >> 2 = 00000001 (binary) <br>
00000001 (binary) is same as 7 / 4 = 1 <br>
So 7 >> 2 = 7 / 4 <br>
<br>

しかし、このロジックがどのように作成されたか知りたいです。
誰かがこのロジックについて詳しく説明できますか?
(たぶんそれは天才の頭の中に現れただけですか?)

そして、このような他の同様のロジックはありますか?

4

10 に答える 10

41

天才の頭の中で「ポップアップ」しませんでした。2 進数を右にシフトすると数値が 2 で除算され、数値を左にシフトすると 2 が乗算されます。これは、102 進数では が 2 であるためです。10数値を(2 進数、10 進数、16 進数のいずれであっても)乗算すると、数値に a が追加0されます (これは事実上左シフトされます)。同様に、10(または 2) で割ると、数値から 2 進数が削除されます (実質的に右シフト)。これが、ロジックが実際に機能する方法です。

bit-twiddleryコンピューターの世界には、そのような言葉 (私が少し前に発明した言葉)がたくさんあります。

http://graphics.stanford.edu/~seander/bithacks.htmlこれは初心者向けです。

これは私のお気に入りの本です

于 2012-11-27T04:01:30.247 に答える
7

C標準では実際にそのように定義されています。

セクション 6.5.7 から:

E1 >> E2 の結果は、E1 を右シフトした E2 ビット位置です。[...] 結果の値は、E1 / 2 E2の商の整数部分です。

ほとんどのアーキテクチャでは、負でない数値に対してx >> 2のみ等しいです。x / 4負の数の場合、通常は反対方向に丸められます。

コンパイラは、常に最適化x / 4してx >> 2. この手法は「強度削減」と呼ばれ、最も古いコンパイラでもこれを行うことができます。したがって、 と書くメリットはありませx / 4x >> 2

于 2012-11-27T04:15:53.070 に答える
6

私はあなたが混乱していると思います"2"

7 >> 2

2で割るべきだと考えています。

here は、数字 (この場合)のビット位置を右 に"2"シフトすることを意味します。"7""2"

数字のビット位置を右にシフトする"1"と、2 で除算する効果があります。

8 >> 1 = 4    // In binary: (00001000) >> 1 = (00000100)

number ビット位置を右にシフトすると"2"、4 で除算する効果があります。

8 >> 2 = 2    // In binary: (00001000) >> 2 = (00000010)
于 2015-06-21T13:14:15.613 に答える
3

コンピュータで使用される2進数システムに固有のものです。

同様のロジックは---左シフト'n'回は、2^nを掛けることを意味します。

于 2012-11-27T03:59:22.283 に答える
2

シフトは実際の分割よりも効率的であるため、彼らはそれを行います。すべての数字を右または左に移動しているだけで、シフトごとに論理的に 2 で乗算/除算しています。

なぜ 7/4 = 1 なのか疑問に思っているのであれば、それは残りの結果 (3/4) が整数になるように切り捨てられているからです。

于 2012-11-27T04:01:03.177 に答える
0

これは、天才的な発想、あるいは単にコンピュータ言語の必要性と呼ぶことができます。

私の考えでは、デバイスとしてのコンピューターは、数値を除算したり乗算したりすることはなく、ビットを加算または単純にシフトするロジックのみを備えています。コンピューターに乗算、減算するように命令することでアルゴリズムを機能させることができますが、ロジックが実際の処理に到達すると、結果はビットのシフトまたはビットの追加の結果になります。

数値を 4 で割った結果を得るために、コンピューターは実際にはビットを 2 つの場所に右シフトし、結果を与えると簡単に考えることができます。

7 in 8-bit binary = 00000111
Shift Right 2 places = 00000001 // (Which is for sure equal to Decimal 1)

Further examples:
//-- We can divide 9 by four by Right Shifting 2 places
9 in 8-bit binary = 00001001
Shift right 2 places: 00000010 // (Which is equal to 9/4 or Decimal 2)

アセンブリ言語プログラミングの深い知識がある人は、より多くの例で説明できます。これらすべての背後にある実際の意味を知りたい場合は、コンピューターのビット レベルの演算とアセンブリ言語を学習する必要があると思います。

于 2012-11-27T04:32:47.820 に答える