論理右シフト
日本語 | 論理右ずらし |
英語 | logical right shift、unsigned right shift、zero-fill right shift |
ふりがな | ろんりみぎしふと |
フリガナ | ロンリミギシフト |
右方向にビットシフトする際に、左端のビットには「常に0をセットする」方法。
「>>>演算子」によるビットシフト。
右ビットシフトを行う際の、左端のビット処理には2種類ある。
・論理右シフト
「常に0をセットする」方法。左端のビットに関わらず常に0をセットする。
・算術右シフト
「シフト前の値をセットする」方法。左端のビットが0であれば0、1であれば1をセットする。
論理右シフトは、左端のビットに関わらず常に0をセットする。
純粋なビット処理を行う場合にはこの演算子を使用することになる。
「>>演算子」による「算術右シフト」は「割り算を行う時に使用する」ようなものなので、恐らくほとんど使う機会はないだろう。そのため、右方向にビットをずらしたい場合には「>>>演算子」を使用する、と憶えてしまってもいいだろう。
「>>>演算子」によるビットシフト。
右ビットシフトを行う際の、左端のビット処理には2種類ある。
・論理右シフト
「常に0をセットする」方法。左端のビットに関わらず常に0をセットする。
・算術右シフト
「シフト前の値をセットする」方法。左端のビットが0であれば0、1であれば1をセットする。
論理右シフトは、左端のビットに関わらず常に0をセットする。
純粋なビット処理を行う場合にはこの演算子を使用することになる。
「>>演算子」による「算術右シフト」は「割り算を行う時に使用する」ようなものなので、恐らくほとんど使う機会はないだろう。そのため、右方向にビットをずらしたい場合には「>>>演算子」を使用する、と憶えてしまってもいいだろう。
参考サイト
- (参考サイトはありません)
// Sample.java
public class Sample
{
public static void main( String[] args )
{
long l;
// -8を右に2ビットシフトします。
// 左端に1が入っていることを確認してください。
l = -8;
System.out.println( l );
outputLongBit( l );
// -8
// 1111111111111111111111111111111111111111111111111111111111111000
l = l >>> 2;
System.out.println( l );
outputLongBit( l );
// 4611686018427387902
// 0011111111111111111111111111111111111111111111111111111111111110
// このように、>>>演算子による「論理右シフト」を行うと、
// 左端には常に0がセットされます。
// 参考:>>演算子による「算術右シフト」の場合。
l = -8;
l = l >> 2;
System.out.println( l );
outputLongBit( l );
// -2
// 1111111111111111111111111111111111111111111111111111111111111110
// このように、算術右シフトを使用すると、マイナスの値が
// 維持されます。
}
/**
* long型変数をビット形式で出力します。
*/
private static void outputLongBit( long l )
{
// long型変数をビット形式で文字列化します。
String source = Long.toBinaryString( l );
// 左0埋めします。
StringBuffer strbuf = new StringBuffer();
for( int iF1 = source.length(); iF1 < 64; ++iF1 )
{
strbuf.append( "0" );
}
strbuf.append( source );
System.out.println( strbuf.toString() );
}
}
public class Sample
{
public static void main( String[] args )
{
long l;
// -8を右に2ビットシフトします。
// 左端に1が入っていることを確認してください。
l = -8;
System.out.println( l );
outputLongBit( l );
// -8
// 1111111111111111111111111111111111111111111111111111111111111000
l = l >>> 2;
System.out.println( l );
outputLongBit( l );
// 4611686018427387902
// 0011111111111111111111111111111111111111111111111111111111111110
// このように、>>>演算子による「論理右シフト」を行うと、
// 左端には常に0がセットされます。
// 参考:>>演算子による「算術右シフト」の場合。
l = -8;
l = l >> 2;
System.out.println( l );
outputLongBit( l );
// -2
// 1111111111111111111111111111111111111111111111111111111111111110
// このように、算術右シフトを使用すると、マイナスの値が
// 維持されます。
}
/**
* long型変数をビット形式で出力します。
*/
private static void outputLongBit( long l )
{
// long型変数をビット形式で文字列化します。
String source = Long.toBinaryString( l );
// 左0埋めします。
StringBuffer strbuf = new StringBuffer();
for( int iF1 = source.length(); iF1 < 64; ++iF1 )
{
strbuf.append( "0" );
}
strbuf.append( source );
System.out.println( strbuf.toString() );
}
}
// Sample.java public class Sample { public static void main( String[] args ) { long l; // -8を右に2ビットシフトします。 // 左端に1が入っていることを確認してください。 l = -8; System.out.println( l ); outputLongBit( l ); // -8 // 1111111111111111111111111111111111111111111111111111111111111000 l = l >>> 2; System.out.println( l ); outputLongBit( l ); // 4611686018427387902 // 0011111111111111111111111111111111111111111111111111111111111110 // このように、>>>演算子による「論理右シフト」を行うと、 // 左端には常に0がセットされます。 // 参考:>>演算子による「算術右シフト」の場合。 l = -8; l = l >> 2; System.out.println( l ); outputLongBit( l ); // -2 // 1111111111111111111111111111111111111111111111111111111111111110 // このように、算術右シフトを使用すると、マイナスの値が // 維持されます。 } /** * long型変数をビット形式で出力します。 */ private static void outputLongBit( long l ) { // long型変数をビット形式で文字列化します。 String source = Long.toBinaryString( l ); // 左0埋めします。 StringBuffer strbuf = new StringBuffer(); for( int iF1 = source.length(); iF1 < 64; ++iF1 ) { strbuf.append( "0" ); } strbuf.append( source ); System.out.println( strbuf.toString() ); } }