Форум программистов, компьютерный форум CyberForum.ru

char within 2 nibble ? - C++

Восстановить пароль Регистрация
 
Ух ты!
Ах ты! All we Astronautы
 Аватар для Ух ты!
120 / 97 / 1
Регистрация: 20.10.2012
Сообщений: 373
Записей в блоге: 2
09.10.2013, 21:40     char within 2 nibble ? #1
Каким образом можно в unsigned char положить два разных unsigned полубайтa, а потом извлечь по отдельности?
мб битовые операции? поля битов в структурах? юнионы ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tsin
 Аватар для Tsin
419 / 395 / 108
Регистрация: 30.12.2012
Сообщений: 1,086
Записей в блоге: 2
Завершенные тесты: 3
09.10.2013, 22:01     char within 2 nibble ? #2
Ух ты!, может быть это как-то поможет?) Сам только недавно стал работать с битовыми полями и объединениями. Будет интересно послушать варианты других ответов на ваш вопрос

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <conio.h>
 
union U
{
    unsigned char ch;
    struct S
    {
        unsigned f_half_bit : 4;
        unsigned sec_half_bit : 4;
    } s;
 
    void printHalfBit(unsigned u);
};
 
void U::printHalfBit(unsigned u)
{
    for(int t = 8; t > 0; t /= 2)
        (u & t) ? std::cout << 1 : std::cout << 0;
    std::cout << '\n'; 
}
 
int main()
{
    U ex;
    ex.ch = 'a';
 
    for(int t = 128; t > 0; t /= 2)
        (ex.ch & t) ? std::cout << 1 : std::cout << 0;
    std::cout << '\n';
 
    ex.printHalfBit(ex.s.f_half_bit);
    ex.printHalfBit(ex.s.sec_half_bit);
 
    getch();
    return 0;
}
newbie666
Заблокирован
09.10.2013, 22:01     char within 2 nibble ? #3
вот
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
unsigned char half_byte_one = 11; //0000 1011
unsigned char half_byte_two = 112; //0111 0000
    
unsigned char storage = 0;
 
storage |= half_byte_one; //кладём первый полубайт в наше так сказать хранилище, тобишб в один целый байт :-)
storage |= half_byte_two; //кладём второй полубайт в наше так сказать хранилище, тобишб в один целый байт :-)
 
unsigned char low_half_byte_mask = 15; //0000 1111
unsigned char high_half_byte_mask = 240; //1111 0000
 
//далее извлекаем из целого байта полубайты
unsigned char result_byte_one = storage & low_half_byte_mask;
unsigned char result_byte_two = storage & high_half_byte_mask;
Правда зачем этот геморой может быть нужен....
Ух ты!
Ах ты! All we Astronautы
 Аватар для Ух ты!
120 / 97 / 1
Регистрация: 20.10.2012
Сообщений: 373
Записей в блоге: 2
09.10.2013, 22:55  [ТС]     char within 2 nibble ? #4
О, спасибо!
Правда зачем этот геморой может быть нужен....
Не поверите, он очень пользителен.
Tsin
 Аватар для Tsin
419 / 395 / 108
Регистрация: 30.12.2012
Сообщений: 1,086
Записей в блоге: 2
Завершенные тесты: 3
09.10.2013, 22:58     char within 2 nibble ? #5
newbie666, а корректно ли отработает ваша прога, если положить вместо
C++
1
unsigned char half_byte_two = 112; //0111 0000
такой вариант, например?
C++
1
unsigned char half_byte_two = 12; //0000 1100
Ух ты!
Ах ты! All we Astronautы
 Аватар для Ух ты!
120 / 97 / 1
Регистрация: 20.10.2012
Сообщений: 373
Записей в блоге: 2
09.10.2013, 23:12  [ТС]     char within 2 nibble ? #6
я пытался так сделать, но компилятор ругается.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
unsigned char twonums = 0;
 
struct twoNibble 
{
    unsigned char n0:4;
    unsigned char n1:4;
 
};
 
int main() 
{
 
    unsigned char a = 15;
    unsigned char b = 0;
 
    twoNibble n;
    n.n0 = a;
    n.n1 = b;
 
    unsigned char r = reinterpret_cast<unsigned char>(n);
 
    twoNibble v = reinterpret_cast<twoNibble>(r);
 
 
    unsigned char na = v.n0;
    unsigned char nb = v.n1;
}
и да в примере от newbie666 не могут храниться числа которые кодируются в одну половину байта, это плохо.
нужно то, сохранить два числа диапазоном 0-15 в байт и их извлечь, они могут быть одними одинаковыми.
мб есть еще варианты?
_stealth_
16 / 16 / 1
Регистрация: 07.06.2012
Сообщений: 100
09.10.2013, 23:16     char within 2 nibble ? #7
в специализации std::vector<bool> это реализовано при помощи битовой маски. наверное так эффективнее.
Ух ты!
Ах ты! All we Astronautы
 Аватар для Ух ты!
120 / 97 / 1
Регистрация: 20.10.2012
Сообщений: 373
Записей в блоге: 2
10.10.2013, 10:11  [ТС]     char within 2 nibble ? #8
в общем вот так работает

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <stdlib.h>
 
unsigned char twonums = 0;
 
union twoNibble 
{
    unsigned char byte;
    struct {
        unsigned char n0:4;
        unsigned char n1:4;
    };
};
 
 
int main() 
{
 
    unsigned char a = 15;
    unsigned char b = 7;
 
    twoNibble n;
    n.n0 = a;
    n.n1 = b;
 
    printf("all byte %d\n", n.byte);
 
    unsigned char na = n.n0;
    unsigned char nb = n.n1;
    
    printf("nibble hi %d\n", na);
    printf("nibble lo %d\n", nb);
 
    getchar();
 
 
    return 0;
}
newbie666
Заблокирован
10.10.2013, 10:44     char within 2 nibble ? #9
Цитата Сообщение от Tsin Посмотреть сообщение
newbie666, а корректно ли отработает ваша прога, если положить вместо
Код C++
1
unsigned char half_byte_two = 112; //0111 0000
такой вариант, например?
Код C++
1
unsigned char half_byte_two = 12; //0000 1100
Не ну ты ж хочешь положить другой полубайт (тоесть старший), а не такой же, как и первый
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.10.2013, 11:26     char within 2 nibble ?
Еще ссылки по теме:

C++ Различное поведение функции которая копирует строки с char* t и char t[]
array char* to char* (значения массива указателей в один указатель) C++
Преобразование char в char* или разделить на две строки C++

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

Или воспользуйтесь поиском по форуму:
Tsin
 Аватар для Tsin
419 / 395 / 108
Регистрация: 30.12.2012
Сообщений: 1,086
Записей в блоге: 2
Завершенные тесты: 3
10.10.2013, 11:26     char within 2 nibble ? #10
newbie666, мне показалось, что ТС нужна была как можно большая гибкость. Поэтому должна быть возможность класть какие угодно полубайты. Ладно, главное, что вопрос решен. Тебе спасибо за вариант решения.
Yandex
Объявления
10.10.2013, 11:26     char within 2 nibble ?
Ответ Создать тему
Опции темы

Текущее время: 08:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru