Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.05.2019, 17:56   #1
SadiQ228
Пользователь
 
Регистрация: 30.10.2017
Сообщений: 66
По умолчанию упаковка распаковка чисел(битовые операции)

у меня есть числа от 1 до 15, тоесть каждое занимает полубайт
мне надо упаковать такие числа (которых всегда четное количество) в один байт попарно:

у меня есть строка:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 11 10 2 3 4 5 6 7 8 8 9
упаковываю ее так:
Код:
private List<Byte> packValues(List<Byte>list){
        List<Byte> packedValues = new ArrayList<Byte>();
        for(byte i = 0; i<list.size()-1; i+=2) {
            Byte tmp = (byte) (list.get(i)<<4 | list.get(i+1));
            packedValues.add(tmp);
        }
        return packedValues;
    }
получаю:
18, 52, 86, 120, -102, -68, -34, -5, -94, 52, 86, 120, -119
это ожидаемый мною результат

далее я пытаюсь снова распаковать такие числа и получить исходную строку вот так:
Код:
private List<Byte> unPackValues(List<Byte>list){
        List<Byte> unPackedValues = new ArrayList<Byte>();
        for(byte i = 0; i<list.size(); i++) {
            byte first = (byte)(list.get(i)>>4);
            unPackedValues.add(first);
            byte second = (byte) (((byte)(list.get(i)<<4))>>4);
            unPackedValues.add(second);
        }
        return unPackedValues;
    }
получаю неожиданный результат:
1, 2, 3, 4, 5, 6, 7, -8, -7, -6, -5, -4, -3, -2, -1, -5, -6, 2, 3, 4, 5, 6, 7, -8, -8, -7

как видно 1и2 3и4 5и6 разложились успешно, но потом пошли какие то странные значения... что не так я делаю?
SadiQ228 вне форума Ответить с цитированием
Старый 23.05.2019, 19:10   #2
SadiQ228
Пользователь
 
Регистрация: 30.10.2017
Сообщений: 66
По умолчанию

Код:
private List<Byte> unPackValues(List<Byte>list){
        List<Byte> unPackedValues = new ArrayList<Byte>();
        for(byte i = 0; i<list.size(); i++) {
            byte first = (byte)((list.get(i)&0xF0)>>4);
            unPackedValues.add(first);
            byte second = (byte) (((byte)(((list.get(i))<<4))>>4&0x0F));
            unPackedValues.add(second);
        }
        return unPackedValues;
    }
SadiQ228 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++ Лабораторная работа 3. Представление чисел в различных системах счисления и битовые операции. Андрей Андрей Помощь студентам 0 04.10.2012 21:57
Упаковка/распаковка .dat файлов (Delphi) $sky$ Помощь студентам 0 06.02.2012 20:53
Произведение чисел через битовые операции magistr011 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 07.11.2011 16:34
Упаковка и распаковка трехдиагональных матриц crewww Общие вопросы C/C++ 2 12.10.2011 18:08
Битовые операции DrAlexx2121 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 14.06.2008 22:26