С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
1 / 1 / 0
Регистрация: 29.01.2014
Сообщений: 30
1

Битовые сдвиги. Запись 1-2 байтных переменных в 8 байтную переменную

13.10.2014, 16:04. Показов 3597. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую!
Допустим у меня есть восьмибайтная переменная:
C++
1
long long all;
И есть у меня переменные в 1 и в 2 байта.
C++
1
2
char var1 = 72;
short int var2 = 2481;
Я хочу записать эти 2 числа в all и после доставать их в обратном порядке. Нужно сделать это сдвигая биты.
Т.е, сдвинул байт - записал значение 127, сдвинул 2 байта - записал значение 31646; а после, обратно сдвинул 2 байта - достал значение 31646, сдвинул байт - достал значение 127.

ps: тема не про union и не про архитектурные проблемы у размера short int.

Добавлено через 1 минуту
Забыл сам вопрос. Как сделать это на синтаксисе C/C++?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.10.2014, 16:04
Ответы с готовыми решениями:

битовые сдвиги
как с помощью битовых сдвигов передвинуть разряды в шестнадцатеричном числе?

Битовые сдвиги
При решении задачи меня поставила в тупик работа битовых сдвигов. Пишу: ... var buf, hbyte:...

Битовые сдвиги и перестановки
Написать программу, которая позволит ввести число типа uint с клавиатуры, напечатать его на...

Заменить битовые сдвиги на умножение
inint proc near push cx push dx push bx push ...

5
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 29
13.10.2014, 16:06 2
Тру:
C
1
(a<<8)|b
Не тру:
C
1
a*256+b
1
1 / 1 / 0
Регистрация: 29.01.2014
Сообщений: 30
13.10.2014, 16:16  [ТС] 3
А обратно как?
0
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 29
13.10.2014, 16:27 4
Самостоятельно
0
1 / 1 / 0
Регистрация: 29.01.2014
Сообщений: 30
14.10.2014, 12:28  [ТС] 5
_Ivana, допустим, у нас есть 1 байт ( a = 01101101) и есть второй байт (b = 01100010).
Записываем их в 4 байта.

// сдвинули и присвоили
C++
1
2
result <<= 8 | a; // = 00000000 01101101
result <<= 8 | b; // = 01101101 01100010
Теперь я хочу достать обратно b, то как я могу прочесть биты с 8 по 16?
Получается нужно поменять местами 1й байт со 2ым сдвинуть вправо результат на байт?
0
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 29
14.10.2014, 16:24 6
Цитата Сообщение от valval Посмотреть сообщение
Получается нужно поменять местами
Можно и так извратиться, но во-первых, не на всех платформах такая ассемблерная команда есть, а во-вторых, она не вынесена "наружу" в битовые операции С. Поэтому делаем так
C++
1
2
r&0xFFFF //получаем b
(r>>8)&0xFFFF //получаем a
Можно вместо битовых операций проделать деление/остаток от деления (аналогично моему примеру выше при запаковке, что вы должны были сами догадаться), но это так же будет не труЪ.
0
14.10.2014, 16:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.10.2014, 16:24
Помогаю со студенческими работами здесь

Для чего в данном коде битовые сдвиги?
Функция определяет количество битов в числе. это не целая программа, а вырванная функция, но мне не...

Определение цвета пикселя, запись его в переменную и сравнение переменных
привет форумчане, решил недавно выйти за пределы изученного когда-то давно на первом курсе и начал...

Вывести 2-битовые значения, упакованные в переменную типа Byte
В переменную типа Byte “упаковано” 4 маленьких неотрицательных целых значений, каждое из которых...

Даны три битовые переменные без знака a, b, c, d. Записать в d наибольшее из значений этих переменных
Даны три битовые переменные без знака a, b, c, d. Записать в d наибольшее из значений этих...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru