Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 23.05.2019, 18:56   #1
SadiQ228
Форумчанин
 
Регистрация: 30.10.2017
Сообщений: 65
Репутация: -6
По умолчанию упаковка распаковка чисел(битовые операции)

у меня есть числа от 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, 20:10   #2
SadiQ228
Форумчанин
 
Регистрация: 30.10.2017
Сообщений: 65
Репутация: -6
По умолчанию

Код:
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 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


07:00.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.