Java Оператор сдвига не работает так же с предварительно сохраненным значением, чем с прямым значением - PullRequest
0 голосов
/ 17 апреля 2020

Это появляется после решения проблемы:

https://www.hackerrank.com/challenges/flipping-bits/problem?h_l=interview&playlist_slugs%5B%5D%5B%5D=interview-preparation-kit&playlist_slugs%5B%5D%5B%5D=miscellaneous

Мое решение:

static long flippingBits(long n) {
    long l=0;                       //Have to pre-declare 0, Why?
    return (~l>>>32)&~n;
}

Но то, что я хотел do - это использование прямого 0 в операторе return вместо объявления его ранее в "long l", например:

static long flippingBits(long n) {
    return (~0>>>32)&~n;            //Using 0 directly don't works.
}

Я также пробовал с круглыми скобками, но тоже самое. После тестирования похоже, что он не может сдвинуться, если я поставлю 0 напрямую.

Почему мне дают другое значение?

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Это должно быть довольно легко исправить.
return (~0>>>32)&~n;: ноль интерпретируется как тип int.
Чтобы сообщить программе, что она имеет тип long, напишите следующее:
return (~0L>>>32)&~n;

0 голосов
/ 17 апреля 2020

В связанной заметке шорты и байты обрабатываются одинаково.

byte b =-16; // 1111000
b = (byte)(b>>>1);
System.out.println(b); //prints -8 and not 120

ANDing с 0xFF решает проблему

b = -16;
b = (byte)((b&0xFF)>>1);
System.out.println(b); // prints 120 as expected.

Причина в том, что b преобразуется сначала к int, а затем к смещению.

В другой ноте, если n длинная, почему вы не просто использовали ~n для переворачивания битов, поскольку это все, что нужно?

...