Невозможно получить длинное значение из побитовой операции - PullRequest
0 голосов
/ 17 января 2019

Мне нужно получить вывод следующей побитовой операции для дальнейшей обработки. К сожалению, каждый раз, когда я пытаюсь преобразовать вывод в тип int или long, я получаю исключение формата числа. Как обеспечить вывод типа, который я могу обработать?

String TYPE = "type";
long TOTAL_MASK = 0xFFFFFFFF;
long BASE_INBOX_TYPE = 20;
long BASE_TYPE_MASK = 0x1F

long type = Integer.valueOf("" + TYPE + " & " + (TOTAL_MASK - BASE_TYPE_MASK) + " | " + BASE_OUTBOX_TYPE + "");

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Некоторые операторы применяют унарное числовое преобразование к одному операнду, который должен создавать значение числового типа, а если операнд имеет тип времени байта, короткий или char, он переводится в значение типа int с помощью расширяющееся примитивное преобразование (§5.1.2).

String TYPE = "type";
long TOTAL_MASK = 0xFFFFFFFF;
long BASE_INBOX_TYPE = ~20; // (~)promotion to int first (not necessary)
long BASE_TYPE_MASK = 0x1F;

long type = (TOTAL_MASK - BASE_TYPE_MASK) | BASE_INBOX_TYPE;

System.out.println(type);
0 голосов
/ 17 января 2019

Integer.valueOf(String) используется для анализа числового литерала из текста, а не для оценки произвольного выражения. Согласно методу javadoc:

Аргумент интерпретируется как представляющий десятичное целое число со знаком, точно так же, как если бы аргумент был передан методу parseInt(java.lang.String).

Вы должны написать свое выражение в виде кода, например ::

long type = (TOTAL_MASK - BASE_TYPE_MASK) | BASE_OUTBOX_TYPE;
...