Как я могу переинтерпретировать байт как целое число в Java?

#java

#java

Вопрос:

У меня проблема с преобразованиями разных типов. В моем коде я пытаюсь использовать байты, а затем преобразовать их в целое число, чтобы иметь возможность записывать количество бит x из целого числа в хранилище определенного типа.

Проблема в том, что когда у меня есть отрицательное число в виде байта, и я преобразую его в целое число, битовое представление в виде целого числа имеет все начальные биты, установленные как 1. Поэтому, когда я пытаюсь сохранить, например, 10 бит из целого числа, я получаю начальные биты как 1 вместо 0, как я ожидал.

Есть ли способ переинтерпретировать байт как целое число, сохранив при этом битовое представление неизменным? Мне не нужно заботиться о фактическом числовом значении целого числа.

Из C я привык иметь значения без знака, которые предотвратили бы эту проблему, но теперь я не понимаю, как справиться с этим в java, ограниченном целыми числами со знаком.

Пример:

 /*
    decimal: -28
    as byte: 11100100
    as integer: 11111111111111111111111111100100
    needed/expected integer: 00000000000000000000000011100100
*/
import java.util.*;
import java.lang.*;
import java.io.*;

class MyClass
{
    public static void main (String[] args) throws java.lang.Exception
    {
        System.out.println(Integer.toBinaryString((byte)-28));
    }
}
  

https://ideone.com/VE960u

Комментарии:

1. Что значит, что вы хотите сохранить битовое представление таким же, но вас не волнует числовое значение? Это одно и то же.

2. «Есть ли способ переинтерпретировать байт как целое число, сохранив при этом битовое представление таким же» — вы можете интуитивно представить операцию, которую вы пытаетесь выполнить, как «сохранение битового представления таким же», но на самом деле это не так. У int есть куча битов, которых у байта просто нет, и заполнение этих битов нулями не означает «сохранение битового представления таким же», как и расширение знака.

3. @Zarwan Идея состоит в том, чтобы сохранить только биты, установленные в целом числе, которые установлены в байте. Когда это будет сделано, числовое значение / интерпретация целого числа будет отличаться от того, каким был байт.

Ответ №1:

 yourInt = yourByte amp; 255;
  

Просто замаскируйте нежелательные биты.