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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Ух ты!
Ах ты! All we Astronautы
121 / 98 / 1
Регистрация: 20.10.2012
Сообщений: 373
Записей в блоге: 2
#1

char within 2 nibble ? - C++

09.10.2013, 21:40. Просмотров 276. Ответов 9
Метки нет (Все метки)

Каким образом можно в unsigned char положить два разных unsigned полубайтa, а потом извлечь по отдельности?
мб битовые операции? поля битов в структурах? юнионы ?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.10.2013, 21:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос char within 2 nibble ? (C++):

(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const& - C++
astxx::manager::connection::connection(std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;, unsigned short); ...

Ошибка в cannot convert char * to char вроде поправил теперь выводит ересь( - C++
Всем доброго дня! У меня такая проблемка.... написал программу, но сначала она ругалась на Cannot convert char* to char теперь вроде...

Error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' - C++
error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' void crpost(const statep &amp;struc1) { ...

Сделать преобразование unsigned char в char, а затем типу int - C++
Здраствуйте, есть вопрос: Число представлено двумя полями: типа long для рублей и unsigned char - для копеек. Собственно что мне...

array char* to char* (значения массива указателей в один указатель) - C++
Как сложить(или вывести в формате char*) все значения массива указателей(char *) воедино, то есть сложить строки и назначить результату...

Ошибка: call of overloaded 'strchr(char&, char)' is ambiguous - C++
Здравствуйте, прога почему-то ругается на функцию strchr, вот кусок кода: #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Tsin
710 / 455 / 130
Регистрация: 30.12.2012
Сообщений: 1,238
Записей в блоге: 2
Завершенные тесты: 3
09.10.2013, 22:01 #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;
}
1
newbie666
Заблокирован
09.10.2013, 22:01 #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;
Правда зачем этот геморой может быть нужен....
2
Ух ты!
Ах ты! All we Astronautы
121 / 98 / 1
Регистрация: 20.10.2012
Сообщений: 373
Записей в блоге: 2
09.10.2013, 22:55  [ТС] #4
О, спасибо!
Правда зачем этот геморой может быть нужен....
Не поверите, он очень пользителен.
0
Tsin
710 / 455 / 130
Регистрация: 30.12.2012
Сообщений: 1,238
Записей в блоге: 2
Завершенные тесты: 3
09.10.2013, 22:58 #5
newbie666, а корректно ли отработает ваша прога, если положить вместо
C++
1
unsigned char half_byte_two = 112; //0111 0000
такой вариант, например?
C++
1
unsigned char half_byte_two = 12; //0000 1100
0
Ух ты!
Ах ты! All we Astronautы
121 / 98 / 1
Регистрация: 20.10.2012
Сообщений: 373
Записей в блоге: 2
09.10.2013, 23:12  [ТС] #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 в байт и их извлечь, они могут быть одними одинаковыми.
мб есть еще варианты?
0
_stealth_
16 / 16 / 1
Регистрация: 07.06.2012
Сообщений: 100
09.10.2013, 23:16 #7
в специализации std::vector<bool> это реализовано при помощи битовой маски. наверное так эффективнее.
0
Ух ты!
Ах ты! All we Astronautы
121 / 98 / 1
Регистрация: 20.10.2012
Сообщений: 373
Записей в блоге: 2
10.10.2013, 10:11  [ТС] #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;
}
0
newbie666
Заблокирован
10.10.2013, 10:44 #9
Цитата Сообщение от Tsin Посмотреть сообщение
newbie666, а корректно ли отработает ваша прога, если положить вместо
Код C++
1
unsigned char half_byte_two = 112; //0111 0000
такой вариант, например?
Код C++
1
unsigned char half_byte_two = 12; //0000 1100
Не ну ты ж хочешь положить другой полубайт (тоесть старший), а не такой же, как и первый
0
Tsin
710 / 455 / 130
Регистрация: 30.12.2012
Сообщений: 1,238
Записей в блоге: 2
Завершенные тесты: 3
10.10.2013, 11:26 #10
newbie666, мне показалось, что ТС нужна была как можно большая гибкость. Поэтому должна быть возможность класть какие угодно полубайты. Ладно, главное, что вопрос решен. Тебе спасибо за вариант решения.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.10.2013, 11:26
Привет! Вот еще темы с ответами:

Ошибка: initializing argument 2 of `char* fgets(char*, int, FILE*) - C++
Написать программу, которая считывает текст из файла и выводит на экран только строки, содержащие двузначные числа Помогите...

Различное поведение функции которая копирует строки с char* t и char t[] - C++
столкнулся с ситуацией которую не могу объяснить пишем функцию которая копирует одну строку в другую: void strstr(char* t,...

функция возвращает массив слов, содержащихся в текстовом сообщении char* Words(char *s) - C++
Стоит такая задача: функция должна возвратить массив слов, содержащихся в текстовом сообщении char* Words(char *s) Как это можно...

Ошибка в работе с файлами: error: incompatible types in assignment of ‘char*’ to ‘char* [255]’ - C++
Суть задания Есть файл допустим 1.txt нужно выполнить обработку этого файла а результат вывести в этот же файл с другим расширением ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.10.2013, 11:26
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru