byte b = 5;
int n = 33;
b<<n
b>>n
私はそれを計算する方法を知っています: これが左シフトの場合、数値を 2 倍して n 乗する必要があり、右シフトの場合は、数値を 2 で割って n 乗する必要があります。
n が小さければ計算できます。nが大きい場合(ここでは33のように)手動で計算する方法を誰かが説明してくれますか、それとも他の方法がありますか?
byte b = 5;
int n = 33;
b<<n
b>>n
私はそれを計算する方法を知っています: これが左シフトの場合、数値を 2 倍して n 乗する必要があり、右シフトの場合は、数値を 2 で割って n 乗する必要があります。
n が小さければ計算できます。nが大きい場合(ここでは33のように)手動で計算する方法を誰かが説明してくれますか、それとも他の方法がありますか?
右オペランドが 31 より大きい場合は、 のlong
代わりに を使用できますint
。その値は -2^63 から 2^63 - 1 の間です。
そして気をつけてください>>
、それはあなたが直感的に思っていることをしません。サインビット搭載!
たとえば、短い文章で次のように書かれています。
1000 0101
右に 3 シフトすると、完全に直感に反する結果が得られます。
1111 0001
それ以外の:
0001 0001
「本当の」右シフトが必要な場合は、>>>
代わりに使用してください。
それよりもさらに大きい場合は、次を使用する必要がありますBigInteger
。
final BigInteger b1 = new BigInteger("5");
BigInteger
has.shiftLeft()
および.shiftRight()
Methods (Java の<<
and >>>
-- トリプル>
に注意してください -- 整数プリミティブ型に相当します)。これらの操作は新しい BigInteger
!を返すことに注意してください。だから、しないでください:
b1.shiftLeft(33);
これは の値には影響しませんb1
。行う:
final BigInteger b2 = b1.shiftLeft(33);
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) のみです。
基本的に、シフトの意味を知っておく必要があります。
(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ループで乗算する代わりに除算するだけです。
手動では、左シフトのために 2^n を掛ける必要があります。そして、右シフトのために手動で行うには、2^n で割り、結果を切り捨てる必要があります。したがって、手動で詳細に行うには次のようにします。
n
その後ろにゼロを追加します。または、バイナリ表現を使用したくない場合: