Вопрос по java – Смещено на отрицательное число в java

4

У меня проблема с оператором shift в Java. Я использовал следующий код и не могу понять, как эта программа генерирует этот вывод. Так что, пожалуйста, объясните мне, как эта программа генерирует этот вывод.

public class Operator {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int s = 8;
        s = s >>-63;
        System.out.println("value of i=" + s);
    }

}

Output: значение i = 4

Ваш Ответ

5   ответов
1
    int s=8;        
    Assert.assertEquals(s >>-63, s >>-63 % 32);
    Assert.assertEquals(s >>-63, s >>-31);
    Assert.assertEquals(s >>-31, s >>32 -31);
    Assert.assertEquals(s >>32 -31,s >>1); 
    Assert.assertEquals(s >>1,s /2); 
    Assert.assertEquals(s/2,4); 
17

раздел 15.19 (операторы смены):

If the promoted type of the left-hand operand is int, only the five lowest-order bits of the right-hand operand are used as the shift distance. It is as if the right-hand operand were subjected to a bitwise logical AND operator & (§15.22.1) with the mask value 0x1f (0b11111). The shift distance actually used is therefore always in the range 0 to 31, inclusive.

Сейчас-63 & 0x1f == 1, Так что это на самом деле сдвиг на 1 вправо, отсюда и ответ 4.

Error: User Rate Limit Exceeded Dipu
Error: User Rate Limit Exceeded Dipu
Error: User Rate Limit ExceededFFFFFFC1Error: User Rate Limit ExceededFFFFFFC1 & 0x0000001f == 0x00000001Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded-63 & 0x1fError: User Rate Limit Exceeded
4

s = s >>-63; какs = s >> 1; (-63 % 32)

Посмотрите наповедение оператора сдвига на JLS & # xA7; 15.19.

0

-63 & 0x1f == 1 для int или-63 & 0x3f == 1 надолго, потому что в Java сдвиг влево с>> использует расширение знака, и 1 сместит любые нулевые биты в случае 8.

0

ел, если вы хотите заменить отрицательное смещение:

r << -shift

а также

r << ((32 - shift) % 32)

(32 - это целое число в Java)

Похожие вопросы