evgeniy8705
@evgeniy8705
Повелитель вселенной

Как понять момент в преобразовании числа в бинарную строку?

Разбираю пример из лекции по Java.
Есть пример: "Кодируем codepoint, который помещается в однобайтный UTF8"
Есть пример кода:
import java.nio.charset.StandardCharsets;

public class App {
    public static void main(String[] args) {
        int codePoint = 0b110011;
        String cp = leftZeroPadding(Integer.toBinaryString(codePoint), 8);

        System.out.println("codePoint: " + cp);

        String str = new String(new int[] {codePoint}, 0, 1);
        byte[] utf8bytes = str.getBytes(StandardCharsets.UTF_8);

        System.out.println("utf8bytes: " + leftZeroPadding(Integer.toBinaryString(0xFF & utf8bytes[0]), 8));
    }

    public static String leftZeroPadding(String str, int length) {
        while (str.length() < length) {
            str = "0" + str;
        }

        return str;
    }
}


Все понятно, только вот не пойму для чего в следующей строке, в методе toBinaryString(), прописано 0xFF? Для чего это?
System.out.println("utf8bytes: " + leftZeroPadding(Integer.toBinaryString(0xFF & utf8bytes[0]), 8));
  • Вопрос задан
  • 260 просмотров
Решения вопроса 1
@zelan
Кратко обо мне не получится.
utf8bytes[0] - имеет тип byte
значения примитивного типа byte лежит в диапазоне от -128 до 127.
метод Integer.toBinaryString(...) преобразует int в бинарную строку.

Теперь смотри:
допустим utf8bytes[0] = 0xFE, на первый взгляд 0xFE= 254, но для типа byte 0xFE=-2.
Если этот 0xFE (типа byte) преобразовать к типу int, то мы получим также -2, но для типа int это будет уже 0xFFFFFFFE.

поэтому делают так: 0xFF & utf8bytes[0]
0xFF в этом выражении имеет тип int и является сокращенной записью 0x000000FF
utf8bytes[0] здесь предположим равен 0xFE и при преобразовании к int будет равен 0xFFFFFFFE

Результат выражения равен 0x000000FE - что соответствует 254, и при преобразовании в bin равен "11111110"
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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