首先说明此处的讨论仅限数值上的区别
测试代码如下
package com.qiu.test; import org.junit.Test; import java.util.Arrays; public class TestArrays { @Test public void testMove(){ int[] a = {-5,-4,-3,3,4,5}; for(int i = 0;i<a.length;i++){ System.out.println("数字"+a[i]+" 右移结果-->"+(a[i]>>1)+ " 除以2结果-->"+a[i]/2); } } }测试结果如下
数字-5 右移结果-->-3 除以2结果-->-2 数字-4 右移结果-->-2 除以2结果-->-2 数字-3 右移结果-->-2 除以2结果-->-1 数字3 右移结果-->1 除以2结果-->1 数字4 右移结果-->2 除以2结果-->2 数字5 右移结果-->2 除以2结果-->2总结
n为非负数时,>> 1和/ 2的结果是一样的n为负数且还是偶数时,>> 1和/ 2的结果是一样的n为负数且还是奇数时,>> 1和/ 2的结果是不一样的原因归纳
原因是奇数除二会发生截断现象。而>> 1和/ 2在n为负奇数时截断的反向不一样。
纵向比较 -5的原码(1000 0101) 反码(1111 1010) 补码(1111 1011) -5 >> 1 = (1111 1011) >> 1 = (1111 1101) = -3 (1000 0011),假设用8-bit表示一个整数,补码表示。发现结果变小了。
-4的原码(1000 0100) 反码(1111 1011) 补码(1111 1100) -4 >> 1 = (1111 1100) >> 1 = (1111 1110) = -2 (1000 0010)
横向比较 -5 / 2 = -2,5 / 2 = 2。这表明除二是向零取整 -5 >> 1 = -3,5 >> 1 = 2。这表明右移一位是向下取整