java中的位移运算测试
程序员文章站
2022-07-08 11:54:23
...
参考链接:https://blog.csdn.net/sxhlovehmm/article/details/44244195
https://blog.csdn.net/qq_35114086/article/details/70173329
1、左移运算 <<
丢弃最高位(符号位同样丢弃),0补最低位
正数左位移:
/** * 左位移测试。 丢弃最高位(符号位同样丢弃),0补最低位 如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。 * 如对int型移动33位,实际上只移动了33%32=1位。 */ @Test public void test3() { int temp = 33; String as = "01000000101001010101001101100101"; // 使用Integer.parseInt方法,将as转整型时,符号位不能为1,如果要表示负数,在as左测最高位添加“-”,而符号位右侧的数值位则表示负数的绝对值原码。 int an = Integer.parseInt(as, 2); System.out.println("原值:" + an + "-->" + Integer.toBinaryString(an)); System.out.println("<<" + temp); int bn = an << temp; System.out.println("运算后:" + bn + "-->" + Integer.toBinaryString(bn)); } /** * temp=1,打印结果: * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101 * <<1 * 运算后:-2125814070-->1000 0001 0100 1010 1010 0110 1100 1010 * * temp=2,打印结果: * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101 * <<2 * 运算后:43339156-->10 1001 0101 0100 1101 1001 0100 * * temp=31,打印结果: * * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101 * <<31 * 运算后:-2147483648-->1000 0000 0000 0000 0000 0000 0000 0000 * * temp=32,打印结果: * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101 * <<32 * 运算后:1084576613-->100 0000 1010 0101 0101 0011 0110 0101 * * temp=33,打印结果: * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101 * <<33 * 运算后:-2125814070-->1000 0001 0100 1010 1010 0110 1100 1010 * */
特殊值的二进制表示:
/** * 特殊值的二进制表示 */ @Test public void test4() { System.out.println(Integer.toBinaryString(-2147483648)); System.out.println(Math.abs(-2147483648)); System.out.println(Integer.toBinaryString(Math.abs(-2147483648))); System.out.println(Integer.toBinaryString(-2147483647)); System.out.println(Integer.toBinaryString(2147483647)); System.out.println(Integer.toBinaryString(0)); System.out.println(Integer.toBinaryString(-1)); } /** * 打印结果: * 10000000000000000000000000000000 * -2147483648 * 10000000000000000000000000000000 * 10000000000000000000000000000001 * 1111111111111111111111111111111 * 0 * 11111111111111111111111111111111 */
负数左位移:
/** * 负数左移 */ @Test public void test6() { int temp = 33; String as = "-1000000101001010101001101100101"; // 使用Integer.parseInt方法,将as转整型时,符号位不能为1,如果要表示负数,在as左测最高位添加“-”,数值位表示负数的绝对值。 int an = Integer.parseInt(as, 2); System.out.println("原值:" + an + "-->" + Integer.toBinaryString(an)); System.out.println("<<" + temp); int bn = an << temp; System.out.println("运算后:" + bn + "-->" + Integer.toBinaryString(bn)); } /** * temp=1,打印结果: * * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011 * <<1 * 运算后:2125814070-->111 1110 1011 0101 0101 1001 0011 0110 * * * temp=2,打印结果: * * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011 * <<2 * 运算后:-43339156-->1111 1101 0110 1010 1011 0010 0110 1100 * * * temp=31,打印结果: * * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011 * <<31 * 运算后:-2147483648-->1000 0000 0000 0000 0000 0000 0000 0000 * * * temp=32,打印结果: * * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011 * <<32 * 运算后:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011 * * * temp=33,打印结果: * * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011 * <<33 * 运算后:2125814070-->111 1110 1011 0101 0101 1001 0011 0110 * */
2、右移运算 >>
符号位不变,左边补上符号位
正数右位移:
/** * 正数右位移 */ @Test public void right1() { int temp = 33; String as = "01000000101001010101001101100101"; int an = Integer.parseInt(as, 2); System.out.println("原值:" + an + "-->" + Integer.toBinaryString(an)); System.out.println(">>" + temp); int bn = an >> temp; System.out.println("运算后:" + bn + "-->" + Integer.toBinaryString(bn)); } /** * temp=1,打印结果: * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101 * >>1 * 运算后:542288306-->10 0000 0101 0010 1010 1001 1011 0010 * * temp=2,打印结果: * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101 * >>2 * 运算后:271144153-->1 0000 0010 1001 0101 0100 1101 1001 * * temp=31,打印结果: * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101 * >>31 * 运算后:0-->0 * * temp=32,打印结果: * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101 * >>32 * 运算后:1084576613-->100 0000 1010 0101 0101 0011 0110 0101 * * temp=33,打印结果: * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101 * >>33 * 运算后:542288306-->10 0000 0101 0010 1010 1001 1011 0010 * */
负数右位移:
/** * 负数右位移 */ @Test public void right2() { int temp = 33; String as = "-01000000101001010101001101100101"; int an = Integer.parseInt(as, 2); System.out.println("原值:" + an + "-->" + Integer.toBinaryString(an)); System.out.println(">>" + temp); int bn = an >> temp; System.out.println("运算后:" + bn + "-->" + Integer.toBinaryString(bn)); } /** * temp=1,打印结果: * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011 * >>1 * 运算后:-542288307-->1101 1111 1010 1101 0101 0110 0100 1101 * * temp=2,打印结果: * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011 * >>2 * 运算后:-271144154-->1110 1111 1101 0110 1010 1011 0010 0110 * * temp=31,打印结果: * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011 * >>31 * 运算后:-1-->1111 1111 1111 1111 1111 1111 1111 1111 * * temp=32,打印结果: * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011 * >>32 * 运算后:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011 * * temp=33,打印结果: * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011 * >>33 * 运算后:-542288307-->1101 1111 1010 1101 0101 0110 0100 1101 */
3、无符号右移
忽略了符号位扩展,0补最高位
正数右移:
/** * 无符号右移:正数 */ @Test public void right3() { int temp = 33; String as = "1000000101001010101001101100101";//1100 0000 1010 0101 0101 0011 0110 0101 int an = Integer.parseInt(as, 2); System.out.println("原值:" + an + "-->" + Integer.toBinaryString(an)); System.out.println(">>>" + temp); int bn = an >>> temp; System.out.println("运算后:" + bn + "-->" + Integer.toBinaryString(bn)); } /** * temp=1,打印结果: * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101 * >>>1 * 运算后:542288306-->10 0000 0101 0010 1010 1001 1011 0010 * * temp=2,打印结果: * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101 * >>>2 * 运算后:271144153-->1 0000 0010 1001 0101 0100 1101 1001 * * temp=31,打印结果: * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101 * >>>31 * 运算后:0-->0 * * temp=32,打印结果: * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101 * >>>32 * 运算后:1084576613-->100 0000 1010 0101 0101 0011 0110 0101 * * temp=32,打印结果: * 原值:1084576613-->100 0000 1010 0101 0101 0011 0110 0101 * >>>33 * 运算后:542288306-->10 0000 0101 0010 1010 1001 1011 0010 */
负数右移:
/** * 无符号右移:负数 */ @Test public void right3() { int temp = 32; String as = "-01000000101001010101001101100101"; int an = Integer.parseInt(as, 2); System.out.println("原值:" + an + "-->" + Integer.toBinaryString(an)); System.out.println(">>" + temp); int bn = an >>> temp; System.out.println("运算后:" + bn + "-->" + Integer.toBinaryString(bn)); } /** * temp=1,打印结果: * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011 * >>>1 * 运算后:1605195341-->101 1111 1010 1101 0101 0110 0100 1101 * * temp=2,打印结果: * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011 * >>>2 * 运算后:802597670-->10 1111 1101 0110 1010 1011 0010 0110 * * temp=31,打印结果: * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011 * >>>31 * 运算后:1-->1 * * temp=32,打印结果: * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011 * >>>32 * 运算后:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011 * * temp=33,打印结果: * 原值:-1084576613-->1011 1111 0101 1010 1010 1100 1001 1011 * >>>33 * 运算后:1605195341-->101 1111 1010 1101 0101 0110 0100 1101 * */
最后一张总结图
上一篇: 就让我练练手吧