JAVA - Разбирать строку, представляющую подписанный tinyint (0-255), в байт? [Дубликат]

min=int(input("min:"))
max=int(input("max:"))
for num in range(min,max):
    for x in range(2,num):
        if(num%x==0 and num!=1):
            break
        else:
            print(num,"is prime")
            break
8
задан stackoverflow 2 January 2013 в 23:15
поделиться

3 ответа

Когда java принимает эти значения, вы теряете этот последний 8-й бит?

No. Вы просто получаете отрицательное значение, когда оно установлено.

Итак, чтобы получить значение от 0 до 255, проще всего использовать что-то вроде этого:

int b = bArray[0] & 0xff;

Сначала byte продвигается до int, который будет расширять его, что приведет к 25 ведущим 1 битам, если старший бит равен 1 в исходном значении. & 0xff затем снова избавляется от первых 24 бит:)

11
ответ дан Jon Skeet 28 August 2018 в 02:36
поделиться

В Java байт (а также короткий, int и long) является только числовыми типами данных , подписанными . Однако это не означает потери данных при их обработке как двоичные данные unsigned . Как показано на рисунке, 10000000 является -128 в качестве знака десятичного числа. Если вы имеете дело с двоичными данными, просто рассматривайте его как свою двоичную форму, и все будет хорошо.

2
ответ дан Code-Apprentice 28 August 2018 в 02:36
поделиться

Нет, вы не потеряете 8-й бит. Но, к сожалению, у Java есть две «особенности», которые делают более трудными, чем разумно иметь дело с такими значениями:

  • все его примитивные типы подписаны;
  • , когда «разворачивается», примитивный тип другому примитивному типу с большим размером (например, чтение byte до int, как это имеет место здесь), знаковый бит «нижнего типа» расширяется.

Это означает, что, например, если вы читаете байт 0x80, который преобразуется в двоичном формате как:

1000 0000

, когда вы читаете его как целое число, вы получаете:

1111 1111 1111 1111 1111 1111 1000 0000
                              ^
                              This freaking bit gets expanded!

, в то время как вы действительно хотели:

0000 0000 0000 0000 0000 0000 1000 0000

, т. е. целочисленное значение 128. Поэтому вы ДОЛЖНЫ его замаскировать:

int b = array[0] & 0xff;

1111 1111 1111 1111 1111 1111 1000 0000 <-- byte read as an int, your original value of b
0000 0000 0000 0000 0000 0000 1111 1111 <-- mask (0xff)
--------------------------------------- <-- anded, give
0000 0000 0000 0000 0000 0000 1000 0000 <-- expected result

Грустно, но верно.

В более общем плане: если вы хотите манипулировать большим количеством байт-ориентированных данных, я предлагаю вам взглянуть на ByteBuffer , это может многое помочь. Но, к сожалению, это не спасет вас от манипуляций с битовой маской, а просто упрощает чтение заданного количества байтов в качестве времени (в качестве примитивных типов).

7
ответ дан fge 28 August 2018 в 02:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: