2
byte b = 5;
int n = 33;
b<<n
b>>n

私はそれを計算する方法を知っています: これが左シフトの場合、数値を 2 倍して n 乗する必要があり、右シフトの場合は、数値を 2 で割って n 乗する必要があります。

n が小さければ計算できます。nが大きい場合(ここでは33のように)手動で計算する方法を誰かが説明してくれますか、それとも他の方法がありますか?

4

4 に答える 4

5

右オペランドが 31 より大きい場合は、 のlong代わりに を使用できますint。その値は -2^63 から 2^63 - 1 の間です。

そして気をつけてください>>、それはあなたが直感的に思っていることをしません。サインビット搭載!

たとえば、短い文章で次のように書かれています。

1000 0101

右に 3 シフトすると、完全に直感に反する結果が得られます。

1111 0001

それ以外の:

0001 0001

「本当の」右シフトが必要な場合は、>>>代わりに使用してください。

それよりもさらに大きい場合は、次を使用する必要がありますBigInteger

final BigInteger b1 = new BigInteger("5");

BigIntegerhas.shiftLeft()および.shiftRight()Methods (Java の<<and >>>-- トリプル>に注意してください -- 整数プリミティブ型に相当します)。これらの操作は新しい BigInteger!を返すことに注意してください。だから、しないでください:

b1.shiftLeft(33);

これは の値には影響しませんb1。行う:

final BigInteger b2 = b1.shiftLeft(33);
于 2013-06-22T10:24:27.713 に答える
3

longの代わりに使用しbyteます。

long b = 5;
int n = 33;
System.out.println(b<<n);//n should be between 0 to 63
System.out.println(b>>n);//since you are using long,the operation returns long

左のオペランドが長い場合、右のオペランドは0 から 63の間でなければなりません

ただし、左オペランドが長くない場合、右オペランドは0 から 31の間でなければなりません

右オペランドが 63 を超える可能性がある場合は、BigIntegerを使用します


ノート

シフト演算子のオペランドとして使用できるのは、整数型 (int、long、byte、short) のみです。

于 2013-06-22T10:27:43.407 に答える
2

基本的に、シフトの意味を知っておく必要があります。

(bits; byte has 8 bits) の5ようにメモリで表される数値がある場合、左にシフト (乗算) するには次のようにします。0000101

00000101 << 1 = 00001010 = 10 (decimal) //shifting bits to the left
00000101 << 3 = 00101000 = 40 (decimal)

右シフト (除算):

00000101 >> 1 = 00000010 = 2 (decimal) //shifting bits to the right
00000101 >> 3 = 00000000 = 0 (decimal)

したがって、ループと数学的な乗算/除算を使用して実行できます。

左にシフトするには - 乗算:

byte b= 5;
long number= (byte)b;
int n= 33;
for (int i=0; i<n; i++) {
    number= number * 2;
}

b = (byte)number;

forループで乗算する代わりに除算するだけです。

于 2013-06-22T10:33:17.010 に答える
0

手動では、左シフトのために 2^n を掛ける必要があります。そして、右シフトのために手動で行うには、2^n で割り、結果を切り捨てる必要があります。したがって、手動で詳細に行うには次のようにします。

  1. ペンと紙を取ります。
  2. シフトしたい番号を書き留めます。
  3. それをバイナリベース表現に変換します。
  4. nその後ろにゼロを追加します。
  5. 数値を元に戻します。

または、バイナリ表現を使用したくない場合:

  1. ペンと紙を取ります。
  2. シフトしたい番号を書き留めます。
  3. 2^n を手動で計算します。次のようになります: 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4192, ...
  4. このテクニックを使って計算した数値を掛けます。それは長い乗算と呼ばれます。
于 2013-06-22T10:39:30.443 に答える