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
Когда java принимает эти значения, вы теряете этот последний 8-й бит?
blockquote>No. Вы просто получаете отрицательное значение, когда оно установлено.
Итак, чтобы получить значение от 0 до 255, проще всего использовать что-то вроде этого:
int b = bArray[0] & 0xff;
Сначала
byte
продвигается доint
, который будет расширять его, что приведет к 25 ведущим 1 битам, если старший бит равен 1 в исходном значении.& 0xff
затем снова избавляется от первых 24 бит:)
В Java байт (а также короткий, int и long) является только числовыми типами данных , подписанными . Однако это не означает потери данных при их обработке как двоичные данные unsigned . Как показано на рисунке, 10000000
является -128
в качестве знака десятичного числа. Если вы имеете дело с двоичными данными, просто рассматривайте его как свою двоичную форму, и все будет хорошо.
Нет, вы не потеряете 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 , это может многое помочь. Но, к сожалению, это не спасет вас от манипуляций с битовой маской, а просто упрощает чтение заданного количества байтов в качестве времени (в качестве примитивных типов).