22

わかりました>>、またはシフトが何を意味するのか調べてみましたが、このサイトで説明されているように頭を悩ませています: http://www.janeg.ca/scjp/oper/shift.html

子供と話している場合、どのような説明になりますか?

4

4 に答える 4

38

コンピュータはバイナリ デバイスです。このため、数値は 1 と 0 の連続で表されます。

ビットシフトは、1 と 0 のシーケンスを左または右に移動するだけです。

したがって、>>演算子はビットを右に 1 ビットシフトするだけです。

数字の 101 を考えてみましょう:

// Assuming signed 8-bit integers
01100101 // How 101 is represented in binary
00110010 // After right shifting one bit, this represents 50

この場合、最下位ビットは切り捨てられました。明らかに、悪魔は細部に宿りますが、それがすべてです。

<<演算子は逆の操作を行います。

// Assuming signed 8-bit integers
01100101 // How 101 is represented in binary
11001010 // After left shifting one bit, this represents -54

// Assuming unsigned 8-bit integers
01100101 // How 101 is represented in binary
11001010 // After left shifting one bit, this represents 202

この場合、8 ビットのみを使用したため、最上位ビットが切り捨てられました。ただし、数値がより多くのビットを持っている場合:

// Assuming signed 16-bit integers
00000000 01100101 // How 101 is represented in binary
00000000 11001010 // After left shifting one bit, this represents 202
00000001 10010100 // After left shifting one bit again, this represents 404

そのため、扱うビット数とそれらのビットに関連付けられているデータ型に応じて、異なる数値が得られる場合があります。

補遺: 2 進数がどのように機能するのか疑問に思っている場合は、10 進数システムがどのように機能するかを考えてみてください。5287 という数字を考えてみましょう。これは次のように記述できます。

5287

しかし、次のように書き出すこともできます。

5287 = (5 * 1000) + (2 * 100) + (8 * 10) + (7 * 1)

次に、次のように書き出すことができます。

5287 = (5 * 10^3) + (2 * 10^2) + (8 * 10^1) + (7 * 10^0)

上記の式は、10 進数システムが 10 進数システムと呼ばれることがある理由を説明しています。10 進数システムでは、10 桁 (0 ~ 9) を使用します。指数が桁位置にどのように対応するかに注意してください。

2 進数システム、つまり base-2 システムはまったく同じものですが、指数の基数として 2 を使用し、0 と 1 の 2 桁のみを使用します。

5287 = 00010100 10100111 (base 2)
     = (0 * 2^15) + (0 * 2^14) + (0 * 2^13) + (1 * 2^12)
     + (0 * 2^11) + (1 * 2^10) + (0 * 2^9)  + (0 * 2^8)
     + (1 * 2^7)  + (0 * 2^6)  + (1 * 2^5)  + (0 * 2^4)
     + (0 * 2^3)  + (1 * 2^2)  + (1 * 2^1)  + (1 * 2^0)
于 2010-10-13T06:06:43.187 に答える
5

私が話している子供はバイナリについて少し知っていると思いますか? :)

すべての数値は、次のように、ある種の 2 進数で表すことができます。

   Base 10 : Base 2
   1 : 0001
   2 : 0010
   3 : 0011
   4 : 0100
   5 : 0101
   6 : 0110
   7 : 0111
   8 : 1000

... 等々。

シフト演算子は、基本的にすべてのビット (1 または 0) を 1 つの位置に移動します。例えば: 000111 >> 1

000111 のすべてのビットを右に 1 桁シフトすると、次のようになります。

000011

000111 << 1

これらのすべてのビットを 1 つ左にシフトして、次のように生成します。

001110

複数シフトすると、ビットがさらに移動します。

現在、使用している言語と使用している数値の種類によっては、それよりも少し複雑になる可能性があります. たとえば、「最上位ビット」(数値の最も左にあるビット) が数値が署名されているかどうかを表す言語で作業している場合、その言語はそれを考慮に入れる必要があります。

数学的に言えば、整数を使用する場合 (コンピューターがビットを格納するためのスペースを使い果たしたために発生するオーバーフローのリスクを無視すると)、1 を左にシフトする (<< 1) は、2 を掛けることと同じであり、 1 で割ることは 2 で割ることと同じです。

于 2010-10-13T06:11:31.267 に答える
4

>>SHIFT RIGHTオペレーター_

例:

class X
      { 
       public static void main(String args[])
       {
         System.out.println("20>>2 = "+20>>2);
       }
      }        

出力:20>>2 = 5

説明:

のバイナリ値20 は次のとおりです。00000000000000000000000000010100

2すべてのビット位置を右にシフト00000000000000000000000000000101

5( 1*2^2 + 0*2^1 + 1*2^0)を与える

于 2010-10-13T06:10:16.887 に答える
0

私はかつてJApplet (bitorgel) を作成し、ビット演算子をいじることができる Web ページに配置しました。ライブで試すことも、ソースをダウンロードすることもできます。私の知る限り、それらは C、C++、および Java で同じように機能します。おそらく C# でも同様です。

于 2012-05-17T02:06:07.273 に答える