Я нашел код Python на github, и мне нужно сделать то же самое в java, я почти преобразовал его в java, но получаю предупреждение: Shift operation '>>' by overly large constant value
это код Python, который я пытаюсь преобразовать
if i > 32:
return (int(((j >> 32) & ((1 << i))))) >> i
return (int((((1 << i)) & j))) >> i
и это java-код, который я сделал, пытаясь преобразовать из кода python
if (i > 32) {
return (j >> 32) & (1 << i) >> i;
}
return ((1 << i) & j) >> i;
предупреждение находится в этой строке (j >> 32)
j - целое число
byte, short, int или long? Точный тип имеет значение.
Возможный дубликат Битшифтинг лонг в Java
Это то же самое, что и j = 0. Вот почему.
К сожалению, при переносе программы на другой язык нельзя предполагать, что все работает так же. Операторы битового сдвига в Java и Python ведут себя совершенно иначе. Не думайте, что ваши результаты будут такими же!
Как вы получили это предупреждение?




Поскольку Java int имеет 32 бита (см. здесь), его сдвиг на 32 бита вправо ничего не оставляет от исходного int, и поэтому не имеет особого смысла.
Это интересно. Это может иметь какое-то отношение к Java 8, разрешающей unsigned int (хотя мне все еще кажется странным сдвигать весь int наружу).
"Java 8 позволяет беззнаковое int" .. что вы имеете в виду?
Подробно об этом говорится в ссылке в моем ответе: «Статические методы, такие как compareUnsigned, diverUnsigned и т. д., Были добавлены в класс Integer для поддержки арифметических операций с целыми числами без знака».
На самом деле это не имеет для меня смысла, потому что сдвиг 32 бита в int ничего не оставляет. Как бы то ни было, если вы хотите имплантировать тот же метод, используя long, вот код, который я написал для этого.
public int bitShift(long j, int i) {
return i > 32 ? ((int) ((j >> 32) & ((long) (1 << i)))) >> i : ((int) (j & ((long) (1 << i)))) >> i;
}
Какой тип
j?