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

Как прописать пол байта нужным значением?

25.04.2013, 11:11. Показов 3260. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет!
Есть, к примеру в байте значение 0х12, а нужно, что б было 0хА2 или 0х1А.
Как более изящно это сделать?
У меня в два этапа получается.
Сначало обнулить изменяемый полубайт через ИЛИ, а потом, опять через ИЛИ "0хА" ему присвоить.
Эта мысль посетила меня ночью. Попробовать смогу только дома. Сейчас я на работе и нет возможности проверить.
Но, должно ж получиться?
Или есть решение за одну операцию?
Спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.04.2013, 11:11
Ответы с готовыми решениями:

"Заливка" памяти нужным значением
Есть некий блок памяти . И есть uint32_t a, равный например 0xAABBCCDD. Каким наиболее быстрым...

Как сравнить DateTime с нужным значением?
Мне необходимо написать условие: сумма трех datetime = 0 Но суммирование даты мне не даст ни 0,...

Как найти в массиве объектов элементы с нужным значением поля?
for (i = 0; i < linksData.length; ++i) { alert("source: " + linksData.source + " target: "...

Как заменить столбец матрицы нужным значением и обновленную матрицу вывести в новый компонент?
Как заменить столбец чисел одним значением ?( StringGrid) У меня дана матрица 3Х6, нужно заменить...

5
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
25.04.2013, 11:38 2
C
1
2
3
4
uint8_t v = 0x12;
uint8_t a = 0xAA;
v &= 0xf0;
v |= a & 0x0f;
Добавлено через 2 минуты
Ну или так может быть понятней: uint8_t val = (0x12 & 0xf0) | (0x2A & 0x0f); // val = 0x1A
1
2 / 2 / 0
Регистрация: 14.08.2012
Сообщений: 100
25.04.2013, 23:29  [ТС] 3
Цитата Сообщение от lazybiz Посмотреть сообщение
C
1
2
3
4
uint8_t v = 0x12;
uint8_t a = 0xAA;
v &= 0xf0;
v |= a & 0x0f;
Добавлено через 2 минуты
Ну или так может быть понятней: uint8_t val = (0x12 & 0xf0) | (0x2A & 0x0f); // val = 0x1A
Спасибо. И так и так понятно.
Вечером попробую, отпишусь.
Хотя, куда оно денется, будет работать

Добавлено через 11 часов 48 минут
Работает.
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
25.04.2013, 23:38 4
Цитата Сообщение от AVL Посмотреть сообщение
Сначало обнулить изменяемый полубайт через ИЛИ,
Это как??
через И знаю
ну тебе уже lazybiz показал
можешь сделать и без масок но переменные должны быть беззнаковые
C++
1
2
3
4
5
unsigned char v = 0x12;
unsigned char a = 0xAA;
v=(v<<4)>>4 ;//выделяем младший полубайт
a= (a>>4)<<4;//выделяем старший полубайт
v=v|a; //складываем
0
2 / 2 / 0
Регистрация: 14.08.2012
Сообщений: 100
26.04.2013, 00:59  [ТС] 5
Цитата Сообщение от ValeryS Посмотреть сообщение
Это как??
через И знаю
ну тебе уже lazybiz показал
можешь сделать и без масок но переменные должны быть беззнаковые
C++
1
2
3
4
5
unsigned char v = 0x12;
unsigned char a = 0xAA;
v=(v<<4)>>4 ;//выделяем младший полубайт
a= (a>>4)<<4;//выделяем старший полубайт
v=v|a; //складываем
Спасибо, я ж написал, что работает, как lazybiz мне помог.
Ваш вариант завтра тоже опробую, для обучения.
А переменная таки беззнаковая.
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
26.04.2013, 05:27 6
Цитата Сообщение от AVL Посмотреть сообщение
А переменная таки беззнаковая.
да
иначе при сдвиге вправо будет копироваться старший(знаковый) бит
и никакого выделения не получится

смотри на примере 0xF5(1111 0101)
выделение старшего полубита
сдвиг вправо
0111 1010
0011 1101
0001 1110
0000 1111

сдвиг влево
0001 1110
0011 1100
0111 1000
1111 0000

выделение младшего полубита
сдвиг влево
1110 1010
1101 0100
1010 1000
0101 0000
сдвиг вправо
0010 1000
0001 0100
0000 1010
0000 0101
если вспомнить что сдвиг влево это умножение на 2 а сдвиг вправо деление на 2
то тоже самое можно написать арифметическими операциями

C++
1
2
3
4
5
unsigned char v = 0x12;
unsigned char a = 0xAA;
v=(v*16)/16 ;//выделяем младший полубайт 16 это 2 в 4
a= (a/16)*16;//выделяем старший полубайт
v=v+a;
0
26.04.2013, 05:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.04.2013, 05:27
Помогаю со студенческими работами здесь

Длительное ожидание элемента с нужным значением
Привет, мужики. Пишу программу на Visual Studio С# + selenium (отличное сочетание). Знания С# и...

Заменить указанную подстроку нужным числовым значением
Составить и отладить программу, заменяющую во введенном строковом выражении указанную подстроку...

Заменить во введенном строковом выражении указанную подстроку нужным числовым значением
Cоставить программу, заменяющую во введенном строковом выражении указанную подстроку нужным...

Заменить во введенном строковом выражении указанную подстроку нужным числовым значением
Составить и отладить программу, заменяющую во введенном строковом выражении указанную подстроку...


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

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