Долго лечится как 32 бита в Java? - PullRequest
0 голосов
/ 26 мая 2018

Я пытаюсь запустить следующий код,

public class MyClass {
    public static void main(String args[]) {
        long x = 1 << 39;
        long l = 537150415L;
        l = l | x;

        System.out.println(x);
        System.out.println(l);
    }
}

Это выводит,

128
537150415

Я ожидал, что x будет большим числом.128 выглядит как 2^7, то есть 2^(39-32).Но я думал, что длина составляет 64 бита.

Я пытаюсь сделать набор чисел, присутствующий в наборе.Числа могут быть между 1-60.

JDoodle ссылка - [https://www.jdoodle.com/online-java-compiler#&togetherjs=uH49U5c4Ej]

Ответы [ 3 ]

0 голосов
/ 26 мая 2018

Проблема в том, что 1 << 39 является 32-битным выражением.Поэтому

long x = 1 << 39;

сначала вычисляет 32-битное значение, а затем расширяет его до 64-битного значения для назначения.

Если вы хотите создать 64-битную маску, используйте 1L << 39.

0 голосов
/ 26 мая 2018

Проблема с Java заключается в том, что int - это то, что было бы int32_t в c ++, а long - это int64_t, нет неподписанных типов.

Это означает, что вы должны взятьэто дополняет два, поэтому, когда установлен верхний бит, у вас есть -2 ^ 64.

Если вы заботитесь только о наборе битов, вам не следует печатать длинные напрямую.Сделайте что-то вроде этого:

for (int i = 0; i < 64; i++) {
 System.out.println((l & (1 << i)) != 0 ? "Bit " + i + " is set" : "Bit " + i + " is not set");
}

Редактировать: Хорошо, пока проблема не в этом, я оставлю ответ ради полноты (потому что это действительно подводные камни для рассмотрения)

0 голосов
/ 26 мая 2018

Вам нужно использовать 1L вместо 1, чтобы представить 1 как литерал long:

long x = 1L << 39;
long l = 537150415L;
l = l | x;

System.out.println(x);
System.out.println(l);

Демо

...