8
    -5 / 2 = -2

    -5 >> 1 = -3

>> 1は数値を2で割ることを先生から学びました。正の数では機能しますが、負の数では機能しません。誰かが私に説明できますか?

ありがとう

4

7 に答える 7

6

BЈовић&神秘的な状態として、負の数でビットシフト演算子を使用することは実装で定義されています。
この理由は、Cが論理ビットシフトと算術ビットシフトを区別しないためです。
(最上位ビットの算術パッド、0の論理パッド)
正の数の場合、これは重要ではありません。算術ビットシフトと論理ビットシフトの両方で、最上位ビットが0として保持されます。
算術5 >> 1
0000 0000 0000 0101 =5
から
0000 0000 0000 0010 =2

論理5>>1
0000 0000 0000 0101 =5
から
0000 0000 0000 0010 =2

ただし、負の数(2のカンプ)の場合
算術-5 >> 1
1111 1111 1111 1011 =-5
から
1111 1111 1111 1101 =-3

論理-5>>1
1111 1111 1111 1011 =-5
から
0111 1111 1111 1101 =32,765

または少なくとも、これは私がそれを理解する方法です

于 2012-12-13T11:38:32.837 に答える
5

正の数では機能しますが、負の数では機能しません。

負の整数でシフト演算子を使用することは、実装で定義されています。


[expr.shift] / 3はこれを伝えます:

E1 >> E2の値は、E1の右シフトされたE2ビット位置です。E1に符号なしの型がある場合、またはE1に符号付きの型があり、負でない値がある場合、結果の値はE1/2E2の商の整数部分になります。E1の型が符号付きで負の値の場合、結果の値は実装によって定義されます。

于 2012-12-13T11:17:06.297 に答える
1

>>1で数を2で割ることを先生から学びました。

整数を2で除算しませんが、(値に応じて)論理または算術シフトを1ビット右に実行します。状況によっては、たまたま2で割った値に等しくなります。

正の数では機能しますが、負の数では機能しません。

どちらの場合も機能しますが、正確な動作は標準では義務付けられておらず、実装によって定義されています。通常は2で除算し、結果を負の無限大に向かって切り捨てます。通常の除算の場合とは対照的に、ゼロに向かって切り捨てます。

参考のために:

于 2012-12-13T12:42:11.410 に答える
1

まず、
バイナリの5は0000 0000 0000 0101ですが、-5はどうでしょうか。ここにあります :

  1. 1を0に、0を1に変更すると、1111 111111111010が得られます。
  2. 次に、その数+ 1を取ると、1111 111111111011が得られます。

これで、次のようになります。-5 = 1111 1111 1111 1011(2の補数形式です)
したがって、-5>>1の計算方法は次のとおりです。

  1. -5の各ビットを左から右に移動します(>>)111 1111 1111 1101(残り15ビットのみ)
  2. -5は負の数であるため、最初のビットに「1」を入力して16ビットにする必要があります。次に1111 1111 1111 1101を取得します(2の補数形式のままです)。
  3. 次に、0を1、1を0に変更して(2の補数で負の数を定義するため、最初のビットを除く)、次に「1」を加えて、通常のバイナリ形式に変換します。したがって、1000 0000 0000 0011=-3を取得します
于 2013-03-18T16:22:35.040 に答える
0

答えは正しいと思います。'/'(除算)演算子として商(除算の結果)を生成します。

あなたの問題で:

-5/2 = -3(quotient) and 1(remainder ). 

したがって、これは正の数と負の数の両方で問題ありません。

正数:

5/2 = 2(quotient) and 1(remainder ). 

したがって、正の数で問題ありません。

ノート

余りが負の数になることはありません。常に正の数です。

于 2012-12-13T11:31:37.097 に答える
0

-5 >> 1=-3の答えだと思います。正の数、たとえば5の場合、2で除算すると、2.5が最も近い最小の整数、つまり2に丸められます。

しかし、負の数-5を考えると、2で割ると-2.5になります。最も近い整数に四捨五入すると-3になります。

于 2013-08-05T10:41:31.147 に答える
0

cでは、右シフト演算子は符号ビットを保持します。したがって、符号ビットを保持しながらビットを右シフトすると、2つの補数形式の負の数が生成されます。

于 2013-09-20T22:32:04.410 に答える