以前只知道,一共有<<(左移),>>(右移),>>>(无符号右移)三种位移符号。
对于左移右移,除了负数往右移动,高位补1之外,其他操作都是补0。无符号右移则是空位补0。
之前以为无符号右移足够大的值时,无论正负值,最后都为0(左侧一直加0)。然而,并不是这样。正数的最小值0,负数的最小值为1。例如 int型 -1(二进制编码:111111.....32位)>>>32 = -1,而不是最开始预想的0。
之后才知道,对一个32位数进行无符号右移操作时,实际的位移为 位移值%32 也就是 >>>32 = >>>0,那么,一个32位数一次最大无符号右移值为31位,由于负数的第一位为-1,则-1XXX(31位X)>>>31 = 000(31个0)1 。
而对于64位的数再说,无符号右移位数为 位移值%64 ,像short这种类型的数,在做位移之前,会先转为int类型,然后再进行转换。