关于JAVA中>>1
和/2
的区别(原码反码补码)
首先说明此处的讨论仅限数值上的区别
测试代码如下
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。这表明右移一位是向下取整