0.工具类代码
//二进制字符串转换为int型
public static int BinstrToIntArray(String binStr) {
int result=0;
char [] binCharArray=binStr.toCharArray();
for (int i = 0; i < binCharArray.length; i++) {
result=result+binCharArray[i]-48;
if(i!=binCharArray.length-1){
result=result<<1;
}
}
return result;
}
1. >> 带符号右移运算符
既然>>被叫做带符号右移运算符。那就要将正数和负数区分来看。
- 代码
//正数右移时,
Integer integer1 = 23;
String str = Integer.toBinaryString(integer1);
System.out.println("23在计算机的二进制表示"+str);
//带符号右移两位
Integer integer2 = integer1 >> 2;
String str2 = Integer.toBinaryString(integer2);
System.out.println("23带符号右移两位的表示"+str2);
System.out.println("23带符号由移两位的十进制表示形式:"+Util.BinstrToIntArray(str2));
//负数右移时
Integer integer3 = -5;
String str3 = Integer.toBinaryString(integer3);
System.out.println("-23在计算机的二进制表示"+str3);
//带符号右移两位
Integer integer4 = integer3 >> 2;
String str4 = Integer.toBinaryString(integer4);
System.out.println("-23带符号右移两位的表示"+str4);
System.out.println("-23带符号右移两位的十进制表示形式:"+Util.BinstrToIntArray(str4));
- 结果:
注意:23在计算机中的二进制实际是 00000000 00000000 00000000 00010111 前面的0被省略了
二进制的原码,反码,补码认识
3. 结论:
number >> n
number为正数时,将number右移n位在高位补零。
number为负数时,将number右移n位在高位补1。
2.>>> 无符号右移运算符
- 代码
//正数无符号右移时,
Integer integer1 = 23;
String str = Integer.toBinaryString(integer1);
System.out.println("23在计算机的二进制表示:"+str);
//无符号右移两位
Integer integer2 = integer1 >>> 2;
String str2 = Integer.toBinaryString(integer2);
System.out.println("23无符号右移两位的表示:"+str2);
System.out.println("23无符号右移两位的十进制表示形式:"+Util.BinstrToIntArray(str2));
//负数无符号右移时
Integer integer3 = -5;
String str3 = Integer.toBinaryString(integer3);
System.out.println("-23在计算机的二进制表示:"+str3);
//无符号符号右移两位
Integer integer4 = integer3 >>> 2;
String str4 = Integer.toBinaryString(integer4);
System.out.println("-23无符号右移两位的表示:"+str4);
System.out.println("-23无符号右移两位的十进制表示形式:"+Util.BinstrToIntArray(str4));
- 结果:
在高位补了零不是以1开头了,所以变成了正数。
- 结论:
number >> n
无符号右移,就是number无论是正数还是负数将其右移n位后,高位补零。
3.<< 带符号左移运算符
猜一下,带符号左移应该 无论对于正数还是对于负数都是在低位补零
- 代码
//正数带符号左移时,
Integer integer1 = 23;
String str = Integer.toBinaryString(integer1);
System.out.println("23在计算机的二进制表示:"+str);
//带符号左移两位
Integer integer2 = integer1 << 2;
String str2 = Integer.toBinaryString(integer2);
System.out.println("23带符号左移两位的表示:"+str2);
System.out.println("23带符号左移两位的十进制表示形式:"+Util.BinstrToIntArray(str2));
//负数带符号左移时
Integer integer3 = -5;
String str3 = Integer.toBinaryString(integer3);
System.out.println("-23在计算机的二进制表示"+str3);
//带符号左移两位
Integer integer4 = integer3 << 2;
String str4 = Integer.toBinaryString(integer4);
System.out.println("-23带符号左移两位的表示"+str4);
System.out.println("-23带符号左移两位的十进制表示形式:"+Util.BinstrToIntArray(str4));
-
结果:
注意:23在计算机中的二进制实际是 00000000 00000000 00000000 00010111 前面的0被省略了
- 结论:
number << n
带符号左移,无论对于正数还是负数,都是在低位补零。
对于正数相当于 乘以了2^n
4. <<< 无符号左移是不存在的
想想看如果存在 number <<< n 的话,它的作用是不是和 << 的作用是一样的。都是左移n位低位补零。 个人理解啊哈