Сдвиг битов Python на Java

Я нашел код 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?

chepner 18.10.2018 15:57
j - целое число
user8193104 18.10.2018 15:58
byte, short, int или long? Точный тип имеет значение.
chepner 18.10.2018 16:01

Возможный дубликат Битшифтинг лонг в Java

Mahmud Ahmad 18.10.2018 16:02

Это то же самое, что и j = 0. Вот почему.

NiVeR 18.10.2018 16:02

К сожалению, при переносе программы на другой язык нельзя предполагать, что все работает так же. Операторы битового сдвига в Java и Python ведут себя совершенно иначе. Не думайте, что ваши результаты будут такими же!

rje 18.10.2018 16:03

Как вы получили это предупреждение?

user5612971 18.10.2018 16:11
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
137
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Поскольку Java int имеет 32 бита (см. здесь), его сдвиг на 32 бита вправо ничего не оставляет от исходного int, и поэтому не имеет особого смысла.

Это интересно. Это может иметь какое-то отношение к Java 8, разрешающей unsigned int (хотя мне все еще кажется странным сдвигать весь int наружу).

Yoav Gur 18.10.2018 16:11

"Java 8 позволяет беззнаковое int" .. что вы имеете в виду?

user5612971 18.10.2018 16:47

Подробно об этом говорится в ссылке в моем ответе: «Статические методы, такие как compareUnsigned, diverUnsigned и т. д., Были добавлены в класс Integer для поддержки арифметических операций с целыми числами без знака».

Yoav Gur 18.10.2018 18:07

На самом деле это не имеет для меня смысла, потому что сдвиг 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;
}

Другие вопросы по теме