Javaのビット演算(ビット演算子)を直接ビット演算の整数型には、これらのタイプは、整数長い、int型、短い、チャー、およびバイト、次の表のビット単位の演算子を含みます。
左シフト(<<)
手順:
パブリッククラスLeftMoving {
パブリック静的無効メイン(文字列[] args){
System.out.println( "5 << 3 =" +(5 << 3))。
}
}
出力:
5 << 3 = 40
計算:
0000 0000 0000 0000 0000 0000 0101 0000?5
0000 0000 0000 0000 0000 0010 1000 0000?40
右シフト(>>)
正数
手順:
パブリッククラスPlusRightMoving {
パブリック静的無効メイン(文字列[] args){
System.out.println( "5 >> 1 =" +(5 >> 1))。
}
}
出力:
5 >> 1 = 2
計算:
0000 0000 0000 0000 0000 0000 0101 0000?5
0000 0000 0000 0000 0000 0000 0010 0000?2
負の数
手順:
パブリッククラスNegativeRightMoving {
パブリック静的無効メイン(文字列[] args){
System.out.println( " - 5 >> 1 =" +( - 5 >> 1))。
}
}
出力:
-5 >> 1 = -3
計算:
1111 1111 1111 1111 1111 1111 1011 1111?-5
1111 1111 1111 1111 1111 1111 1101 1111?-3
符号なし右シフト(>>>)
手順:
パブリッククラスUnsignedRightMoving {
パブリック静的無効メイン(文字列[] args){
System.out.println( " - 5 >>> 1 =" +( - 5 >>> 1))。
}
}
出力:
-5 >>> 1 = 2147483645
計算:
1111 1111 1111 1111 1111 1111 1011 1111?-5
1111 1111 1111 1111 1111 1111 1101 0111?2147483645
Javaデータ型の基本的な知識を補足。
ビット整数演算が反対しているので、ここでは2つのfloat floatとdoubleが含まれるものは、それは、この記事では考慮されません。ビット操作は、長いタイプ及び他のタイプに加えて、自動的に変換後、intに変換される場合、薬学的に右オペランドの長さは32です。場合ビット操作、常に第1のさらなるシフト操作に短い整数型とバイトの整数値に変換します。
手順:
パブリッククラスByteLeftMoving {
パブリック静的無効メイン(文字列[] args){
バイトB = 127。
System.out.println( "B << 3 =" +(B << 3))。
System.out.println( "(バイト)(B << 3)=" +(バイト)(B << 3))。
}
}
出力:
B << 3 = 1016
(バイト)(B << 3)= - 8
手順:
パブリッククラスCharLeftMoving {
パブリック静的無効メイン(文字列[] args){
チャーC = 'L'。
System.out.println( "C << 3 =" +(C << 3))。
System.out.println("(char)(c<<3)="+(char)(c<<3));
}
}
输出结果:
c<<3=864
(char)(c<<3)=?
以上两个例子全部编译通过,由此可以看出,当byte和char进行移位运算时不会发生错误,并且均按照整型进行计算,当计算结果超出byte或是char所能表示的范围时则进行相应的转换(分别输出了结果-8和?)。
位运算中的操作数
在进行移位运算时要注意整型和长整型在内存中的位数(整型是32位,长整型是64位),如果移位操作数超出了该位数则取模计算,例如:int型数据是32位的,如果左移35位是什么结果?
程序:
public class LeftMoving{
public static void main(String[] args){
System.out.println("5<<35="+(5<<35));
}
}
输出结果:
5<<35=40
该结果与5<<3完全相同。
无论正数、负数,它们的右移、左移、无符号右移 32位都是其本身,比如 -5<<32=-5、-5>>32=-5、-5>>>32=-5。
一个有趣的现象是,把 1 左移 31 位再右移 31位,其结果为 -1。
计算过程如下:
0000 0000 0000 0000 0000 0000 0000 0001
1000 0000 0000 0000 0000 0000 0000 0000
1111 1111 1111 1111 1111 1111 1111 1111
位运算要求操作数为整数,操作数不能是字符串也不能是小数。
如下列程序:
public class BitMath{
public static void main(String[] args){
String s = "Hello";
long l = 99;
double d = 1.11;
int i = 1;
int j = 0;
System.out.println("j<<s="+j<<s); //编译错误语句
System.out.println("j<<d="+j<<d); //编译错误语句
System.out.println("i<<j="+i<<j); //编译可以通过
System.out.println("i<<l="+i<<l); //编译可以通过
}
}
由于位运算是二进制运算,不要与一些八进制数搞混,java中二进制数没有具体的表示方法。
public class BitMath{
public static void main(String[] args){
System.out.println("010|4="+(010|4));
}
}
输出结果:
010|4=12
计算过程:
0000 0000 0000 0000 0000 0000 0000 1000 ?8
0000 0000 0000 0000 0000 0000 0000 0100 ?4
进行“或”计算结果为:
0000 0000 0000 0000 0000 0000 0000 1100 ?12
当位运算中遇见负数,必须把它转成补码(不知道什么是补码的补习功课去)再进行计算,而不是使用原码。
程序:
public class BitMath{
public static void main(String[] args){
try {
int x = -7;
System.out.println("x>>1="+(x>>1));
} catch(Exception e) {
System.out.println("Exception");
}
}
}
输出结果:
x>>1=-4
计算过程:
1111 1111 1111 1111 1111 1111 1111 1001 ?-7
1111 1111 1111 1111 1111 1111 1111 1100 ?-4
public class BitMath{
public static void main(String[] args){
int i = 1;
int j = -1;
System.out.println("1>>>31="+(i>>>31));
System.out.println("-1>>31="+(j>>31));
}
}
输出结果:
1>>>31=0
-1>>31=-1
程序:
public class BitMath{
public static void main(String[] args){
int a = 1;
a <<= 31;
a >>= 31;
a >>= 1;
System.out.println("a="+a);
int b = 1;
b <<= 31;
B >> = 31。
System.out.println( "B =" + B)。
INT C = 1。
C >> = 31。
C << = 31。
System.out.println( "C =" + C)。
}
}
出力:
= -1
B = -1
C = 0
計算:
0000 0000 0000 0000 0000 0000 0000 0001?A = 1
0000 0000 0000 1000 0000 0000 0000 0000?A = 31の後、そこであると考えられる<<負に
1,111,111,111,111,111 1,111,111,111,111,111は?= A >> 31の後、結果は-1
1111 1111 1111 1111 1111 1111 1111 1111?A = A >> 1、-1で結果
0000 0000 0000 0000 0000 0000 0000 0001?C = 1
0000 0000 0000 0000 0000 0000 0000 0000?Cの後に= C >> 31 0
0000 0000 0000 0000 0000 0000 0000 0000?0はまだ31を左0