前言:写 分析轮子(一)-ArrayList.java 的时候看到源码中有 int newCapacity = oldCapacity + (oldCapacity >> 1); 这样的代码,以前也学习过左移、右移,无符号右移三类移位运算符,不过忘记了具体的变化规则,于是就实验了一把,便有了本篇博文。

注:玩的是JDK1.7版本

一:先看结论

1)<< 左移 将左操作数向左移动,无论做操作数是正还是负,都在低位补“0”

2)>> 带符号的右移 将左操作数右移,如果左操作数是正数,则高位补“0”,如果左操作数是负数,则高位补“1”

3)>>> 无符号右移,将左操作数右移,无论左操作数是正还是负,都在高位补“0”

二:再看代码

代码中,我实验了极少一部分数据,不过也能达到我们实验的目的,这个如果有兴趣,可以自己玩一下,程序比较简单,调整下参数执行一下就一目了然!

/**
* @description:移位运算符测试类
* @author:godtrue
* @create:2018-09-05
*/
public class Move {
/**
* 开始循环的基值
*/
private static final int START_LOOP = -15; /**
* 结束循环的基值
*/
private static final int END_LOOP = 15; /**
* 移动的位置
*/
private static final int MOVE_POSITION = 1; /**
*
*@description: 测试的入口方法
*@param args
*@return: void
*@author: godtrue
*@createTime: 2018-09-05
*@version: v1.0
*/
public static void main(String[] args) {
showBinaryNum();
System.out.println("\n\n\n");
rightMove();
System.out.println("\n\n\n");
rightMoveUnsigned();
System.out.println("\n\n\n");
leftMove();
} /**
*
*@description: 测试 无符号右移移位运算符
*@param
*@return: void
*@author: godtrue
*@createTime: 2018-09-05
*@version: v1.0
*/
private static void rightMove(){
int line = 1;
for (int i = Move.START_LOOP; i <= Move.END_LOOP; i++) {
StringBuilder logInfo = new StringBuilder()
.append("[ ").append("第 ").append(line++).append(" 行")
.append(" ] [ ").append("测试 右移 移位运算符 >> ")
.append(" ] [ ").append("the test num is :").append(i)
.append(" ] [ ").append(i).append(" >> ").append(Move.MOVE_POSITION).append(" is :").append(i >> Move.MOVE_POSITION)
.append(" ] [ ").append("binary style is :").append(Integer.toBinaryString(i)).append(" >> ").append(Move.MOVE_POSITION).append(" is :").append(Integer.toBinaryString((i >> Move.MOVE_POSITION)))
.append(" ]");
printLogInfo(i,logInfo);
}
} /**
*
*@description: 测试 无符号右移移位运算符
*@param
*@return: void
*@author: godtrue
*@createTime: 2018-09-05
*@version: v1.0
*/
private static void rightMoveUnsigned(){
int line = 1;
for (int i = Move.START_LOOP; i <= Move.END_LOOP; i++) {
StringBuilder logInfo = new StringBuilder()
.append("[ ").append("第 ").append(line++).append(" 行")
.append(" ] [ ").append("测试 无符号右移 移位运算符 >>> ")
.append(" ] [ ").append(i).append(" >>> ").append(Move.MOVE_POSITION).append(" is :").append(i >>> Move.MOVE_POSITION)
.append(" ] [ ").append("binary style is :").append(Integer.toBinaryString(i)).append(" >>> ").append(Move.MOVE_POSITION).append(" is :").append(Integer.toBinaryString((i >>> Move.MOVE_POSITION)))
.append(" ]");
printLogInfo(i,logInfo);
}
} /**
*
*@description: 测试 左移移位运算符
*@param
*@return: void
*@author: godtrue
*@createTime: 2018-09-05
*@version: v1.0
*/
private static void leftMove(){
int line = 1;
for (int i = Move.START_LOOP; i <= Move.END_LOOP; i++) {
StringBuilder logInfo = new StringBuilder()
.append("[ ").append("第 ").append(line++).append(" 行")
.append(" ] [ ").append("测试 左移 移位运算符 << ")
.append(" ] [ ").append(i).append(" << ").append(Move.MOVE_POSITION).append(" is :").append(i << Move.MOVE_POSITION)
.append(" ] [ ").append("binary style is :").append(Integer.toBinaryString(i)).append(" << ").append(Move.MOVE_POSITION).append(" is :").append(Integer.toBinaryString((i << Move.MOVE_POSITION)))
.append(" ]");
printLogInfo(i,logInfo);
}
} /**
*
*@description:
*@param
*@return: void
*@author: godtrue
*@createTime: 2018-09-05
*@version: v1.0
*/
private static void showBinaryNum(){
int line = 1;
for (int i = Move.START_LOOP; i <= Move.END_LOOP; i++) {
StringBuilder logInfo = new StringBuilder()
.append("[ ").append("第 ").append(line++).append(" 行")
.append(" ] [ ").append("测试 数据 各种进制 的展示形式")
.append(" ] [ ").append("十进制数:").append(i)
.append(" ] [ ").append("二进制表示形式为:").append(Integer.toBinaryString(i))
.append(" ] [ ").append("八进制表示形式为:").append(Integer.toOctalString(i))
.append(" ] [ ").append("十六进制表示形式为:").append(Integer.toHexString(i))
.append(" ] [ ").append("二进制表示形式为(带符号):").append(Integer.toString(i,2))
.append(" ] [ ").append("八进制表示形式为(带符号):").append(Integer.toString(i,8))
.append(" ] [ ").append("十六进制表示形式为(带符号):").append(Integer.toString(i,16))
.append(" ]");
printLogInfo(i,logInfo);
}
} /**
*
*@description: 打印测试日志信息
*@param i
*@param logInfo
*@return: void
*@author: godtrue
*@createTime: 2018-09-05
*@version: v1.0
*/
private static void printLogInfo(int i,StringBuilder logInfo){
if (i == 0) {
System.out.println("\n"+logInfo+"\n");
}else{
System.out.println(logInfo);
}
}
}

三:结合代码运行的日志,回头再看结论(之所以,贴出程序执行日志,是因为通过执行日志能很好的理解移位操作的运算规则)

1)数据的十进制、二进制、八进制、十六进制的表示形式,移位操作是针对二进制数据而言的,清楚其二进制的表示形式,理解移位操作就简单多了

[ 第 1 行 ]   [ 测试 数据 各种进制 的展示形式 ]   [ 十进制数:-15 ]   [ 二进制表示形式为:11111111111111111111111111110001 ]   [ 八进制表示形式为:37777777761 ]   [ 十六进制表示形式为:fffffff1 ]   [ 二进制表示形式为(带符号):-1111 ]   [ 八进制表示形式为(带符号):-17 ]   [ 十六进制表示形式为(带符号):-f ]
[ 第 2 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:-14 ] [ 二进制表示形式为:11111111111111111111111111110010 ] [ 八进制表示形式为:37777777762 ] [ 十六进制表示形式为:fffffff2 ] [ 二进制表示形式为(带符号):-1110 ] [ 八进制表示形式为(带符号):-16 ] [ 十六进制表示形式为(带符号):-e ]
[ 第 3 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:-13 ] [ 二进制表示形式为:11111111111111111111111111110011 ] [ 八进制表示形式为:37777777763 ] [ 十六进制表示形式为:fffffff3 ] [ 二进制表示形式为(带符号):-1101 ] [ 八进制表示形式为(带符号):-15 ] [ 十六进制表示形式为(带符号):-d ]
[ 第 4 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:-12 ] [ 二进制表示形式为:11111111111111111111111111110100 ] [ 八进制表示形式为:37777777764 ] [ 十六进制表示形式为:fffffff4 ] [ 二进制表示形式为(带符号):-1100 ] [ 八进制表示形式为(带符号):-14 ] [ 十六进制表示形式为(带符号):-c ]
[ 第 5 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:-11 ] [ 二进制表示形式为:11111111111111111111111111110101 ] [ 八进制表示形式为:37777777765 ] [ 十六进制表示形式为:fffffff5 ] [ 二进制表示形式为(带符号):-1011 ] [ 八进制表示形式为(带符号):-13 ] [ 十六进制表示形式为(带符号):-b ]
[ 第 6 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:-10 ] [ 二进制表示形式为:11111111111111111111111111110110 ] [ 八进制表示形式为:37777777766 ] [ 十六进制表示形式为:fffffff6 ] [ 二进制表示形式为(带符号):-1010 ] [ 八进制表示形式为(带符号):-12 ] [ 十六进制表示形式为(带符号):-a ]
[ 第 7 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:-9 ] [ 二进制表示形式为:11111111111111111111111111110111 ] [ 八进制表示形式为:37777777767 ] [ 十六进制表示形式为:fffffff7 ] [ 二进制表示形式为(带符号):-1001 ] [ 八进制表示形式为(带符号):-11 ] [ 十六进制表示形式为(带符号):-9 ]
[ 第 8 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:-8 ] [ 二进制表示形式为:11111111111111111111111111111000 ] [ 八进制表示形式为:37777777770 ] [ 十六进制表示形式为:fffffff8 ] [ 二进制表示形式为(带符号):-1000 ] [ 八进制表示形式为(带符号):-10 ] [ 十六进制表示形式为(带符号):-8 ]
[ 第 9 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:-7 ] [ 二进制表示形式为:11111111111111111111111111111001 ] [ 八进制表示形式为:37777777771 ] [ 十六进制表示形式为:fffffff9 ] [ 二进制表示形式为(带符号):-111 ] [ 八进制表示形式为(带符号):-7 ] [ 十六进制表示形式为(带符号):-7 ]
[ 第 10 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:-6 ] [ 二进制表示形式为:11111111111111111111111111111010 ] [ 八进制表示形式为:37777777772 ] [ 十六进制表示形式为:fffffffa ] [ 二进制表示形式为(带符号):-110 ] [ 八进制表示形式为(带符号):-6 ] [ 十六进制表示形式为(带符号):-6 ]
[ 第 11 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:-5 ] [ 二进制表示形式为:11111111111111111111111111111011 ] [ 八进制表示形式为:37777777773 ] [ 十六进制表示形式为:fffffffb ] [ 二进制表示形式为(带符号):-101 ] [ 八进制表示形式为(带符号):-5 ] [ 十六进制表示形式为(带符号):-5 ]
[ 第 12 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:-4 ] [ 二进制表示形式为:11111111111111111111111111111100 ] [ 八进制表示形式为:37777777774 ] [ 十六进制表示形式为:fffffffc ] [ 二进制表示形式为(带符号):-100 ] [ 八进制表示形式为(带符号):-4 ] [ 十六进制表示形式为(带符号):-4 ]
[ 第 13 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:-3 ] [ 二进制表示形式为:11111111111111111111111111111101 ] [ 八进制表示形式为:37777777775 ] [ 十六进制表示形式为:fffffffd ] [ 二进制表示形式为(带符号):-11 ] [ 八进制表示形式为(带符号):-3 ] [ 十六进制表示形式为(带符号):-3 ]
[ 第 14 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:-2 ] [ 二进制表示形式为:11111111111111111111111111111110 ] [ 八进制表示形式为:37777777776 ] [ 十六进制表示形式为:fffffffe ] [ 二进制表示形式为(带符号):-10 ] [ 八进制表示形式为(带符号):-2 ] [ 十六进制表示形式为(带符号):-2 ]
[ 第 15 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:-1 ] [ 二进制表示形式为:11111111111111111111111111111111 ] [ 八进制表示形式为:37777777777 ] [ 十六进制表示形式为:ffffffff ] [ 二进制表示形式为(带符号):-1 ] [ 八进制表示形式为(带符号):-1 ] [ 十六进制表示形式为(带符号):-1 ] [ 第 16 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:0 ] [ 二进制表示形式为:0 ] [ 八进制表示形式为:0 ] [ 十六进制表示形式为:0 ] [ 二进制表示形式为(带符号):0 ] [ 八进制表示形式为(带符号):0 ] [ 十六进制表示形式为(带符号):0 ] [ 第 17 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:1 ] [ 二进制表示形式为:1 ] [ 八进制表示形式为:1 ] [ 十六进制表示形式为:1 ] [ 二进制表示形式为(带符号):1 ] [ 八进制表示形式为(带符号):1 ] [ 十六进制表示形式为(带符号):1 ]
[ 第 18 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:2 ] [ 二进制表示形式为:10 ] [ 八进制表示形式为:2 ] [ 十六进制表示形式为:2 ] [ 二进制表示形式为(带符号):10 ] [ 八进制表示形式为(带符号):2 ] [ 十六进制表示形式为(带符号):2 ]
[ 第 19 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:3 ] [ 二进制表示形式为:11 ] [ 八进制表示形式为:3 ] [ 十六进制表示形式为:3 ] [ 二进制表示形式为(带符号):11 ] [ 八进制表示形式为(带符号):3 ] [ 十六进制表示形式为(带符号):3 ]
[ 第 20 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:4 ] [ 二进制表示形式为:100 ] [ 八进制表示形式为:4 ] [ 十六进制表示形式为:4 ] [ 二进制表示形式为(带符号):100 ] [ 八进制表示形式为(带符号):4 ] [ 十六进制表示形式为(带符号):4 ]
[ 第 21 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:5 ] [ 二进制表示形式为:101 ] [ 八进制表示形式为:5 ] [ 十六进制表示形式为:5 ] [ 二进制表示形式为(带符号):101 ] [ 八进制表示形式为(带符号):5 ] [ 十六进制表示形式为(带符号):5 ]
[ 第 22 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:6 ] [ 二进制表示形式为:110 ] [ 八进制表示形式为:6 ] [ 十六进制表示形式为:6 ] [ 二进制表示形式为(带符号):110 ] [ 八进制表示形式为(带符号):6 ] [ 十六进制表示形式为(带符号):6 ]
[ 第 23 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:7 ] [ 二进制表示形式为:111 ] [ 八进制表示形式为:7 ] [ 十六进制表示形式为:7 ] [ 二进制表示形式为(带符号):111 ] [ 八进制表示形式为(带符号):7 ] [ 十六进制表示形式为(带符号):7 ]
[ 第 24 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:8 ] [ 二进制表示形式为:1000 ] [ 八进制表示形式为:10 ] [ 十六进制表示形式为:8 ] [ 二进制表示形式为(带符号):1000 ] [ 八进制表示形式为(带符号):10 ] [ 十六进制表示形式为(带符号):8 ]
[ 第 25 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:9 ] [ 二进制表示形式为:1001 ] [ 八进制表示形式为:11 ] [ 十六进制表示形式为:9 ] [ 二进制表示形式为(带符号):1001 ] [ 八进制表示形式为(带符号):11 ] [ 十六进制表示形式为(带符号):9 ]
[ 第 26 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:10 ] [ 二进制表示形式为:1010 ] [ 八进制表示形式为:12 ] [ 十六进制表示形式为:a ] [ 二进制表示形式为(带符号):1010 ] [ 八进制表示形式为(带符号):12 ] [ 十六进制表示形式为(带符号):a ]
[ 第 27 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:11 ] [ 二进制表示形式为:1011 ] [ 八进制表示形式为:13 ] [ 十六进制表示形式为:b ] [ 二进制表示形式为(带符号):1011 ] [ 八进制表示形式为(带符号):13 ] [ 十六进制表示形式为(带符号):b ]
[ 第 28 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:12 ] [ 二进制表示形式为:1100 ] [ 八进制表示形式为:14 ] [ 十六进制表示形式为:c ] [ 二进制表示形式为(带符号):1100 ] [ 八进制表示形式为(带符号):14 ] [ 十六进制表示形式为(带符号):c ]
[ 第 29 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:13 ] [ 二进制表示形式为:1101 ] [ 八进制表示形式为:15 ] [ 十六进制表示形式为:d ] [ 二进制表示形式为(带符号):1101 ] [ 八进制表示形式为(带符号):15 ] [ 十六进制表示形式为(带符号):d ]
[ 第 30 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:14 ] [ 二进制表示形式为:1110 ] [ 八进制表示形式为:16 ] [ 十六进制表示形式为:e ] [ 二进制表示形式为(带符号):1110 ] [ 八进制表示形式为(带符号):16 ] [ 十六进制表示形式为(带符号):e ]
[ 第 31 行 ] [ 测试 数据 各种进制 的展示形式 ] [ 十进制数:15 ] [ 二进制表示形式为:1111 ] [ 八进制表示形式为:17 ] [ 十六进制表示形式为:f ] [ 二进制表示形式为(带符号):1111 ] [ 八进制表示形式为(带符号):17 ] [ 十六进制表示形式为(带符号):f ]

2)>> 带符号的右移 将左操作数右移,如果左操作数是正数,则高位补“0”,如果左操作数是负数,则高位补“1”,如下是右移一位的日志结果

[ 第 1 行 ]   [ 测试 右移 移位运算符 >>  ]   [ the test num is :-15 ]   [ -15 >> 1 is :-8 ]   [ binary style is :11111111111111111111111111110001 >> 1 is :11111111111111111111111111111000 ]
[ 第 2 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :-14 ] [ -14 >> 1 is :-7 ] [ binary style is :11111111111111111111111111110010 >> 1 is :11111111111111111111111111111001 ]
[ 第 3 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :-13 ] [ -13 >> 1 is :-7 ] [ binary style is :11111111111111111111111111110011 >> 1 is :11111111111111111111111111111001 ]
[ 第 4 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :-12 ] [ -12 >> 1 is :-6 ] [ binary style is :11111111111111111111111111110100 >> 1 is :11111111111111111111111111111010 ]
[ 第 5 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :-11 ] [ -11 >> 1 is :-6 ] [ binary style is :11111111111111111111111111110101 >> 1 is :11111111111111111111111111111010 ]
[ 第 6 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :-10 ] [ -10 >> 1 is :-5 ] [ binary style is :11111111111111111111111111110110 >> 1 is :11111111111111111111111111111011 ]
[ 第 7 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :-9 ] [ -9 >> 1 is :-5 ] [ binary style is :11111111111111111111111111110111 >> 1 is :11111111111111111111111111111011 ]
[ 第 8 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :-8 ] [ -8 >> 1 is :-4 ] [ binary style is :11111111111111111111111111111000 >> 1 is :11111111111111111111111111111100 ]
[ 第 9 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :-7 ] [ -7 >> 1 is :-4 ] [ binary style is :11111111111111111111111111111001 >> 1 is :11111111111111111111111111111100 ]
[ 第 10 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :-6 ] [ -6 >> 1 is :-3 ] [ binary style is :11111111111111111111111111111010 >> 1 is :11111111111111111111111111111101 ]
[ 第 11 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :-5 ] [ -5 >> 1 is :-3 ] [ binary style is :11111111111111111111111111111011 >> 1 is :11111111111111111111111111111101 ]
[ 第 12 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :-4 ] [ -4 >> 1 is :-2 ] [ binary style is :11111111111111111111111111111100 >> 1 is :11111111111111111111111111111110 ]
[ 第 13 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :-3 ] [ -3 >> 1 is :-2 ] [ binary style is :11111111111111111111111111111101 >> 1 is :11111111111111111111111111111110 ]
[ 第 14 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :-2 ] [ -2 >> 1 is :-1 ] [ binary style is :11111111111111111111111111111110 >> 1 is :11111111111111111111111111111111 ]
[ 第 15 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :-1 ] [ -1 >> 1 is :-1 ] [ binary style is :11111111111111111111111111111111 >> 1 is :11111111111111111111111111111111 ] [ 第 16 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :0 ] [ 0 >> 1 is :0 ] [ binary style is :0 >> 1 is :0 ] [ 第 17 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :1 ] [ 1 >> 1 is :0 ] [ binary style is :1 >> 1 is :0 ]
[ 第 18 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :2 ] [ 2 >> 1 is :1 ] [ binary style is :10 >> 1 is :1 ]
[ 第 19 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :3 ] [ 3 >> 1 is :1 ] [ binary style is :11 >> 1 is :1 ]
[ 第 20 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :4 ] [ 4 >> 1 is :2 ] [ binary style is :100 >> 1 is :10 ]
[ 第 21 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :5 ] [ 5 >> 1 is :2 ] [ binary style is :101 >> 1 is :10 ]
[ 第 22 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :6 ] [ 6 >> 1 is :3 ] [ binary style is :110 >> 1 is :11 ]
[ 第 23 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :7 ] [ 7 >> 1 is :3 ] [ binary style is :111 >> 1 is :11 ]
[ 第 24 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :8 ] [ 8 >> 1 is :4 ] [ binary style is :1000 >> 1 is :100 ]
[ 第 25 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :9 ] [ 9 >> 1 is :4 ] [ binary style is :1001 >> 1 is :100 ]
[ 第 26 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :10 ] [ 10 >> 1 is :5 ] [ binary style is :1010 >> 1 is :101 ]
[ 第 27 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :11 ] [ 11 >> 1 is :5 ] [ binary style is :1011 >> 1 is :101 ]
[ 第 28 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :12 ] [ 12 >> 1 is :6 ] [ binary style is :1100 >> 1 is :110 ]
[ 第 29 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :13 ] [ 13 >> 1 is :6 ] [ binary style is :1101 >> 1 is :110 ]
[ 第 30 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :14 ] [ 14 >> 1 is :7 ] [ binary style is :1110 >> 1 is :111 ]
[ 第 31 行 ] [ 测试 右移 移位运算符 >> ] [ the test num is :15 ] [ 15 >> 1 is :7 ] [ binary style is :1111 >> 1 is :111 ]

3)>>> 无符号右移,将左操作数右移,无论左操作数是正还是负,都在高位补“0”,如下是右移一位的日志结果

[ 第 1 行 ]   [ 测试 无符号右移 移位运算符 >>>  ]   [ -15 >>> 1 is :2147483640 ]   [ binary style is :11111111111111111111111111110001 >>> 1 is :1111111111111111111111111111000 ]
[ 第 2 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ -14 >>> 1 is :2147483641 ] [ binary style is :11111111111111111111111111110010 >>> 1 is :1111111111111111111111111111001 ]
[ 第 3 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ -13 >>> 1 is :2147483641 ] [ binary style is :11111111111111111111111111110011 >>> 1 is :1111111111111111111111111111001 ]
[ 第 4 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ -12 >>> 1 is :2147483642 ] [ binary style is :11111111111111111111111111110100 >>> 1 is :1111111111111111111111111111010 ]
[ 第 5 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ -11 >>> 1 is :2147483642 ] [ binary style is :11111111111111111111111111110101 >>> 1 is :1111111111111111111111111111010 ]
[ 第 6 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ -10 >>> 1 is :2147483643 ] [ binary style is :11111111111111111111111111110110 >>> 1 is :1111111111111111111111111111011 ]
[ 第 7 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ -9 >>> 1 is :2147483643 ] [ binary style is :11111111111111111111111111110111 >>> 1 is :1111111111111111111111111111011 ]
[ 第 8 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ -8 >>> 1 is :2147483644 ] [ binary style is :11111111111111111111111111111000 >>> 1 is :1111111111111111111111111111100 ]
[ 第 9 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ -7 >>> 1 is :2147483644 ] [ binary style is :11111111111111111111111111111001 >>> 1 is :1111111111111111111111111111100 ]
[ 第 10 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ -6 >>> 1 is :2147483645 ] [ binary style is :11111111111111111111111111111010 >>> 1 is :1111111111111111111111111111101 ]
[ 第 11 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ -5 >>> 1 is :2147483645 ] [ binary style is :11111111111111111111111111111011 >>> 1 is :1111111111111111111111111111101 ]
[ 第 12 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ -4 >>> 1 is :2147483646 ] [ binary style is :11111111111111111111111111111100 >>> 1 is :1111111111111111111111111111110 ]
[ 第 13 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ -3 >>> 1 is :2147483646 ] [ binary style is :11111111111111111111111111111101 >>> 1 is :1111111111111111111111111111110 ]
[ 第 14 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ -2 >>> 1 is :2147483647 ] [ binary style is :11111111111111111111111111111110 >>> 1 is :1111111111111111111111111111111 ]
[ 第 15 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ -1 >>> 1 is :2147483647 ] [ binary style is :11111111111111111111111111111111 >>> 1 is :1111111111111111111111111111111 ] [ 第 16 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ 0 >>> 1 is :0 ] [ binary style is :0 >>> 1 is :0 ] [ 第 17 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ 1 >>> 1 is :0 ] [ binary style is :1 >>> 1 is :0 ]
[ 第 18 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ 2 >>> 1 is :1 ] [ binary style is :10 >>> 1 is :1 ]
[ 第 19 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ 3 >>> 1 is :1 ] [ binary style is :11 >>> 1 is :1 ]
[ 第 20 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ 4 >>> 1 is :2 ] [ binary style is :100 >>> 1 is :10 ]
[ 第 21 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ 5 >>> 1 is :2 ] [ binary style is :101 >>> 1 is :10 ]
[ 第 22 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ 6 >>> 1 is :3 ] [ binary style is :110 >>> 1 is :11 ]
[ 第 23 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ 7 >>> 1 is :3 ] [ binary style is :111 >>> 1 is :11 ]
[ 第 24 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ 8 >>> 1 is :4 ] [ binary style is :1000 >>> 1 is :100 ]
[ 第 25 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ 9 >>> 1 is :4 ] [ binary style is :1001 >>> 1 is :100 ]
[ 第 26 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ 10 >>> 1 is :5 ] [ binary style is :1010 >>> 1 is :101 ]
[ 第 27 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ 11 >>> 1 is :5 ] [ binary style is :1011 >>> 1 is :101 ]
[ 第 28 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ 12 >>> 1 is :6 ] [ binary style is :1100 >>> 1 is :110 ]
[ 第 29 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ 13 >>> 1 is :6 ] [ binary style is :1101 >>> 1 is :110 ]
[ 第 30 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ 14 >>> 1 is :7 ] [ binary style is :1110 >>> 1 is :111 ]
[ 第 31 行 ] [ 测试 无符号右移 移位运算符 >>> ] [ 15 >>> 1 is :7 ] [ binary style is :1111 >>> 1 is :111 ]

4)<< 左移 将左操作数向左移动,无论做操作数是正还是负,都在低位补“0”,如下是左移一位的日志结果

[ 第 1 行 ]   [ 测试 左移 移位运算符 <<  ]   [ -15 << 1 is :-30 ]   [ binary style is :11111111111111111111111111110001 << 1 is :11111111111111111111111111100010 ]
[ 第 2 行 ] [ 测试 左移 移位运算符 << ] [ -14 << 1 is :-28 ] [ binary style is :11111111111111111111111111110010 << 1 is :11111111111111111111111111100100 ]
[ 第 3 行 ] [ 测试 左移 移位运算符 << ] [ -13 << 1 is :-26 ] [ binary style is :11111111111111111111111111110011 << 1 is :11111111111111111111111111100110 ]
[ 第 4 行 ] [ 测试 左移 移位运算符 << ] [ -12 << 1 is :-24 ] [ binary style is :11111111111111111111111111110100 << 1 is :11111111111111111111111111101000 ]
[ 第 5 行 ] [ 测试 左移 移位运算符 << ] [ -11 << 1 is :-22 ] [ binary style is :11111111111111111111111111110101 << 1 is :11111111111111111111111111101010 ]
[ 第 6 行 ] [ 测试 左移 移位运算符 << ] [ -10 << 1 is :-20 ] [ binary style is :11111111111111111111111111110110 << 1 is :11111111111111111111111111101100 ]
[ 第 7 行 ] [ 测试 左移 移位运算符 << ] [ -9 << 1 is :-18 ] [ binary style is :11111111111111111111111111110111 << 1 is :11111111111111111111111111101110 ]
[ 第 8 行 ] [ 测试 左移 移位运算符 << ] [ -8 << 1 is :-16 ] [ binary style is :11111111111111111111111111111000 << 1 is :11111111111111111111111111110000 ]
[ 第 9 行 ] [ 测试 左移 移位运算符 << ] [ -7 << 1 is :-14 ] [ binary style is :11111111111111111111111111111001 << 1 is :11111111111111111111111111110010 ]
[ 第 10 行 ] [ 测试 左移 移位运算符 << ] [ -6 << 1 is :-12 ] [ binary style is :11111111111111111111111111111010 << 1 is :11111111111111111111111111110100 ]
[ 第 11 行 ] [ 测试 左移 移位运算符 << ] [ -5 << 1 is :-10 ] [ binary style is :11111111111111111111111111111011 << 1 is :11111111111111111111111111110110 ]
[ 第 12 行 ] [ 测试 左移 移位运算符 << ] [ -4 << 1 is :-8 ] [ binary style is :11111111111111111111111111111100 << 1 is :11111111111111111111111111111000 ]
[ 第 13 行 ] [ 测试 左移 移位运算符 << ] [ -3 << 1 is :-6 ] [ binary style is :11111111111111111111111111111101 << 1 is :11111111111111111111111111111010 ]
[ 第 14 行 ] [ 测试 左移 移位运算符 << ] [ -2 << 1 is :-4 ] [ binary style is :11111111111111111111111111111110 << 1 is :11111111111111111111111111111100 ]
[ 第 15 行 ] [ 测试 左移 移位运算符 << ] [ -1 << 1 is :-2 ] [ binary style is :11111111111111111111111111111111 << 1 is :11111111111111111111111111111110 ] [ 第 16 行 ] [ 测试 左移 移位运算符 << ] [ 0 << 1 is :0 ] [ binary style is :0 << 1 is :0 ] [ 第 17 行 ] [ 测试 左移 移位运算符 << ] [ 1 << 1 is :2 ] [ binary style is :1 << 1 is :10 ]
[ 第 18 行 ] [ 测试 左移 移位运算符 << ] [ 2 << 1 is :4 ] [ binary style is :10 << 1 is :100 ]
[ 第 19 行 ] [ 测试 左移 移位运算符 << ] [ 3 << 1 is :6 ] [ binary style is :11 << 1 is :110 ]
[ 第 20 行 ] [ 测试 左移 移位运算符 << ] [ 4 << 1 is :8 ] [ binary style is :100 << 1 is :1000 ]
[ 第 21 行 ] [ 测试 左移 移位运算符 << ] [ 5 << 1 is :10 ] [ binary style is :101 << 1 is :1010 ]
[ 第 22 行 ] [ 测试 左移 移位运算符 << ] [ 6 << 1 is :12 ] [ binary style is :110 << 1 is :1100 ]
[ 第 23 行 ] [ 测试 左移 移位运算符 << ] [ 7 << 1 is :14 ] [ binary style is :111 << 1 is :1110 ]
[ 第 24 行 ] [ 测试 左移 移位运算符 << ] [ 8 << 1 is :16 ] [ binary style is :1000 << 1 is :10000 ]
[ 第 25 行 ] [ 测试 左移 移位运算符 << ] [ 9 << 1 is :18 ] [ binary style is :1001 << 1 is :10010 ]
[ 第 26 行 ] [ 测试 左移 移位运算符 << ] [ 10 << 1 is :20 ] [ binary style is :1010 << 1 is :10100 ]
[ 第 27 行 ] [ 测试 左移 移位运算符 << ] [ 11 << 1 is :22 ] [ binary style is :1011 << 1 is :10110 ]
[ 第 28 行 ] [ 测试 左移 移位运算符 << ] [ 12 << 1 is :24 ] [ binary style is :1100 << 1 is :11000 ]
[ 第 29 行 ] [ 测试 左移 移位运算符 << ] [ 13 << 1 is :26 ] [ binary style is :1101 << 1 is :11010 ]
[ 第 30 行 ] [ 测试 左移 移位运算符 << ] [ 14 << 1 is :28 ] [ binary style is :1110 << 1 is :11100 ]
[ 第 31 行 ] [ 测试 左移 移位运算符 << ] [ 15 << 1 is :30 ] [ binary style is :1111 << 1 is :11110 ]

四:补充

    /**
*
*@description: 测试的入口方法
*@param args
*@return: void
*@author: godtrue
*@createTime: 2018-09-05
*@version: v1.0
*/
public static void main(String[] args) {
System.out.println("整数 -1 的二进制表示:"+Integer.toBinaryString(-1));
System.out.println("整数 0 的二进制表示:"+Integer.toBinaryString(0));
System.out.println("整数 1 的二进制表示:"+Integer.toBinaryString(1));
System.out.println();
System.out.println("长整型 -1 的二进制表示:"+Long.toBinaryString(-1L));
System.out.println("长整型 0 的二进制表示:"+Long.toBinaryString(0L));
System.out.println("长整型 1 的二进制表示:"+Long.toBinaryString(1L)); //ToDo Boolean Byte Short Float Double 都没有 toBinaryString 方法
}
整数 -1 的二进制表示:11111111111111111111111111111111
整数 0 的二进制表示:0
整数 1 的二进制表示:1 长整型 -1 的二进制表示:1111111111111111111111111111111111111111111111111111111111111111
长整型 0 的二进制表示:0
长整型 1 的二进制表示:1 Process finished with exit code 0

分析轮子(二)- << ,>>,>> (左移、右移、无符号右移)的更多相关文章

  1. ABAP语言实现 左移 <<、无符号右移 >>> 位移操作

    这几天要在ABAP中实现 3DES 标准对称加密算法,与其他外部系统进行加密/解密操作.由于ABAP语言中没有 左移 <<.无符号右移 >>>  操作,只能自己实现 思路 ...

  2. 原码,反码,补码 与(&) 或(|) 非(~) 异或(^) 左移 << 右移 >> 无符号右移 >>>

    原码 数字在计算机中以二进制表示,8位的字长,最高位是符号位, 正数为0,负数为1.比如,3为0000 0011: -3为1000 0011. 注意,Java中int为32位.3的16进制表示为3,- ...

  3. java右移>> 无符号右移>>>

    >>>是无符号右移,在高位补零 >>是带符号的右移,如果是正数则在高位补零,负数则补1 int a = -1; System.out.println(a>>1 ...

  4. java的<<左移,>>右移,>>>无符号右移

    >>右移 右移,道在二进制中,假设用一个32位的Int表示一个64,那么高位就都是0,所以当我们把整个二进制数右移,如0100000 >> 2 = 0001000,可以看到右移 ...

  5. [JAVA]移位运算(左移<<,右移>>和无符号右移>>>)

    一.背景知识 整数在内存中是以二进制的形式存在的,而且存的是该整数的补码.最高位代表符号位,正数为0,负数为1 正数的补码是其二进制本身,负数的补码则是 符号位保持1不变,其他位按位取反再加1,+0和 ...

  6. java移位运算符:<<(左移)、>>(带符号右移)和>>>(无符号右移)。

    1. 左移运算符 左移运算符<<使指定值的所有位都左移规定的次数. 1)它的通用格式如下所示: value << num num 指定要移位值value 移动的位数. 左移的规 ...

  7. Java负整数的左移、右移、无符号右移

    转自  Java负整数的左移.右移.无符号右移 Java负整数的左移.右移.无符号右移.正数的位移没有涉及到符号,而且正数的原码.反码.补码都是一样的,所以相对简单,但是对于负整数的位移,往往容易混淆 ...

  8. java移位运算符实验程序:&lt;&lt;(左移)、&gt;&gt;(带符 号右移)和&gt;&gt;&gt;(无符号右移)

    public class txs { static void leftbit(){ int i;               //整型长度为32位                           ...

  9. 异或运算符(^)、与运算符(&)、或运算符(|)、反运算符(~)、右移运算符(>>)、无符号右移运算符(>>>)

    目录 异或(^).异或和 的性质及应用总结 异或的含义 异或的性质:满足交换律和结合律 异或的应用 按位 与运算符(&) 按位 或运算符(|) 取 反运算符(~) 右移运算符(>> ...

随机推荐

  1. Webmin的安装

    Webmin的安装很简单,下面就详细说一下安装步骤. 1.用ssh客户端软件登陆服务器2.切换目录到root下,命令是:cd /root/3.下载Webmin的安装文件,命令是:wget http:/ ...

  2. Django之第三方登陆模块

    Django之第三方登陆模块 前期准备 安装 django-allauth pip install django-allauth 注意,django-allauth 需要在 Django1.10以上版 ...

  3. 利用nginx,腾讯云免费证书制作https

    之前一直在研究,https怎么弄.最近看到了腾讯云提供的免费得ssl证书,寻思把网站弄成https. 首先先去腾讯云购买一个免费得证书. 点击后填写内容, 然后下载证书 解压证书就可以看到,提供四种方 ...

  4. vue实例属性之methods和computed

    我们可以把同一函数放在methods或者computed中,区别在于computed有缓存,计算属性只有在它的相关依赖发生改变时才会重新求值,即数据改变才会执行函数.而methods每当触发重新渲染时 ...

  5. BZOJ.4826.[AHOI/HNOI2017]影魔(树状数组/莫队 单调栈)

    BZOJ LOJ 洛谷 之前看\(mjt\)用莫队写了,以为是一种正解,码了3h结果在LOJ T了没A= = 心态爆炸(upd:发现是用C++11(NOI)交的,用C++11交就快一倍了...) 深刻 ...

  6. Scrapy基础(四)————Scrapy的使用Pycharm进行Debuge设置

    好比Django的Debuge 与前端进行交互时的方便,但是Scrapy 不自带,所以我们写一个main文件来debuge 作用:通过cmd 命令启动爬虫 #-*-coding:utf-8 -*- # ...

  7. 用STM32CudeMX 配置用到的函数(记住他!)

    1.设置PB5的电平:HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, 0);2.读取PB5的电平值:int a = HAL_GPIO_ReadPin(GPIOB, GPIO_ ...

  8. 关于数据ajax请求

    默认设置下,所有请求均为异步请求.如果需要发送同步请求,请将此选项设置为 false.注意,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行. var temp; $.ajax({ asy ...

  9. Java 多线程 ReadWriteLock

    ReadWriteLock是JDK 1.5提供的读写分离锁,可以减少锁竞争.例如,线程A1.A2和A3进行写操作,线程B1.B2和B3进行读操作,如果使用重入锁或者内部锁,那么理论上所有读之间.读与写 ...

  10. JavaScript面向对象的三大特性

    1.JavaScript面向对象的三大特性 JavaScript的三大特性:封装性.继承性.多态性. 2.JavaScript实现封装特性 在一些静态类型的语言如java中,本身语法就提供了这些功能. ...