barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

понедельник, 23 декабря 2013 г.

Java: работа с беззнаковым байтом

Задача

На входе имеем байт (типа byte), хранящий некоторое беззнаковое целое. Нужно привести его к типу int.

Решение

Как известно, в Java нет unsinged-типов, т.е. сам по себе byte трактуется как знаковое целое. Нам же нужно, чтобы байт был истрактован как беззнаковое целое, т.е. чтобы его старший разряд имел вес 128 вместо -128 (для представления отрицательных чисел в Java используется дополнительный код). Чтобы преобразовать беззнаковый байт в int, нужно сделать следующее:
int num = (int) bite & 0xFF
Побитовый "&" нужен вот зачем: при обычном касте  байта к int произойдет расширение знакового разряда, т.е., например, если на входе был байт 1000 0000 (двоичное представление беззнакового числа "128"), после приведения к 4-ехбайтовому int получим:
1111 1111  1111 1111  1111 1111  1000 0000 
, что является двоичным представлением знакового целого "-128", тогда как нам нужно:
0000 0000  0000 0000  0000 0000  1000 0000
, т.е. знавое целое "128".
Это самое "расширение" знакового разряда и исправляется побитовым "И" с числом 0xFF:
1111 1111  1111 1111  1111 1111  1000 0000
&
0000 0000  0000 0000  0000 0000  1111 1111
=
0000 0000  0000 0000  0000 0000  1000 0000

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

Отправить комментарий