Я нашел простой ответ: |
public class abc
{
public static void main (String[] args)
{
byte b = -1;
String binString = Integer.toBinaryString(b); //value 1111,1111,1111,1111,1111,1111,1111,1111
new BigInteger(binString, 2).byteValue(); //value -1
}
}
Он усекает binString, но это не влияет на значение байта, потому что 24 бита слева на самом деле не имеют отношения к байту.
Теперь в приведенном выше примере я использую BigInteger и его метод byteValue (), причина этого и то, почему я не просто использую решение 0xff, заключается в том, что Integer.toBinaryString ()в приведенном выше коде будет возвращена строковая цифра (32 1) длиной 32, которая не может быть преобразована в целое или даже длинное, потому что это слишком большое число / значение.В результате этого, не имея возможности привести его к типу int или long, никто не может выполнять такие операции, как &, поэтому решение состоит в том, чтобы обрезать строку из 24 бит слева, после чего можноприведение / преобразование более короткой строки в int, что и делает BigInteger в приведенном выше коде.
Байт все равно будет сохранять свое значение, поскольку значение содержится только в 8 битах справа (остается истиннымк тому, что байт).Добавленные 24 бита, которые Java иногда добавляет к 8-битному байту, предназначены для собственных целей java и могут быть проигнорированы, если это необходимо, например, проблема, которая породила этот поток.