Биты, байты...
От: Tosha Россия  
Дата: 31.05.04 15:22
Оценка:
Вопрос такой:
Допустим F0=11111010
А вот как получить четыре бита, т.е 0000?
Есть ли вообще операторы для таких действий?

И вообще, можноли ли определить где в байте 1, а где 0?
... << RSDN@Home 1.1.3 stable >>
Re: Биты, байты...
От: Анатолий Широков СССР  
Дата: 31.05.04 15:28
Оценка:
Здравствуйте, Tosha, Вы писали:

T>Вопрос такой:

T>Допустим F0=11111010
T>А вот как получить четыре бита, т.е 0000?
T>Есть ли вообще операторы для таких действий?

T>И вообще, можноли ли определить где в байте 1, а где 0?



typedef unsigned char byte;

// инициализация байта
byte b(0xF7);
// получение старших четырех бит
byte hi = (0xF0 & b) >> 4;
// получение младших четырез бит
byte lo = (0x0F & b);
// номер бита (нумерация с 0)
byte n = 4;
// проверка того, что n-ый бит равен 1
bool ok = b & (1 << bit);
Re[2]: Биты, байты...
От: Tosha Россия  
Дата: 31.05.04 19:40
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>
АШ>typedef unsigned char byte;

АШ>// инициализация байта
АШ>byte b(0xF7);
АШ>


А если без инициализации?
Допустим из порта считали байт, записали его в переменную read типа BYTE;
А дальше?

АШ>
АШ>// получение старших четырех бит
АШ>byte hi = (0xF0 & b) >> 4;
АШ>


Как тут быть?
Может так: BYTE hi=read>>4;?
... << RSDN@Home 1.1.3 stable >>

Исправлено форматирование, удалено избыточное цитирование. -- ПК
Re: Биты, байты...
От: _nn_  
Дата: 01.06.04 06:15
Оценка: 10 (2)
Здравствуйте, Tosha, Вы писали:

T>Вопрос такой:

T>Допустим F0=11111010
T>А вот как получить четыре бита, т.е 0000?
T>Есть ли вообще операторы для таких действий?

T>И вообще, можноли ли определить где в байте 1, а где 0?


Может воспользоваться битовыми полями ?
union byte_t
{
 unsigned char b;
 struct bits_t 
 {
  unsigned int b0 : 1;
  unsigned int b1 : 1;
  unsigned int b2 : 1;
  unsigned int b3 : 1;
  unsigned int b4 : 1;
  unsigned int b5 : 1;
  unsigned int b6 : 1;
  unsigned int b7 : 1;
 };
 struct bits_t bits;
};

Использование :
union byte_t b;
b.b=0xF0;
// b.b = 0xF0
// b.bits.b0 = 0
// b.bits.b1 = 0
// b.bits.b2 = 0
// b.bits.b3 = 0
// b.bits.b4 = 1
// b.bits.b5 = 1
// b.bits.b6 = 1
// b.bits.b7 = 1
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Биты, байты...
От: AndreyFil Россия  
Дата: 01.06.04 10:54
Оценка:
Здравствуйте, Tosha, Вы писали:

Можно так:

[сcode]
byte b(read);
[/сcode]

а дальше как написано.
Re[2]: Биты, байты...
От: Июнь  
Дата: 01.06.04 11:24
Оценка: +1
Здравствуйте, _nn_, Вы писали:

__>Может воспользоваться битовыми полями ?

Мне не понятно, почему и зачем члены структуры unsigned int.
Можно записать так, с использованием unnamed structure:
union byte_t
{
 unsigned char b;
 struct
 {
  unsigned char b0 : 1;
  unsigned char b1 : 1;
  unsigned char b2 : 1;
  unsigned char b3 : 1;
  unsigned char b4 : 1;
  unsigned char b5 : 1;
  unsigned char b6 : 1;
  unsigned char b7 : 1;
 };
 
};


Тогда использование короче:
union byte_t b;
b.b=0xF0;
b.b0 = 1;


Внесены авторские исправления. -- ПК
Re[3]: Биты, байты...
От: _nn_  
Дата: 01.06.04 11:39
Оценка:
Здравствуйте, Июнь, Вы писали:

И>Здравствуйте, _nn_, Вы писали:


__>>Может воспользоваться битовыми полями ?

И>Мне не понятно, почему и зачем члены структуры unsigned int.
И>Можно записать так, с использованием unnamed structure:
Можно так сделать.
Я ведь не привожу идеальный код, который подходит всем.
И>
И>union byte_t
И>{
И> unsigned char b;
И> struct
И> {
И>  unsigned char b0 : 1;
И>  unsigned char b1 : 1;
И>  unsigned char b2 : 1;
И>  unsigned char b3 : 1;
И>  unsigned char b4 : 1;
И>  unsigned char b5 : 1;
И>  unsigned char b6 : 1;
И>  unsigned char b7 : 1;
И> }
И> 
И>};
И>


И>Тогда использование короче:

И>
И>union byte_t b;
И>b.b=0xF0;
И>b.b0 = 1;
И>
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: Биты, байты...
От: Tosha Россия  
Дата: 01.06.04 15:08
Оценка:
О, вроде разобрался, спасибо за консультацию!
... << RSDN@Home 1.1.3 stable >>
Re[3]: Биты, байты...
От: Павел Кузнецов  
Дата: 01.06.04 16:14
Оценка:
> Можно записать так, с использованием unnamed structure:
>
> union byte_t
> {
>  unsigned char b;
>  struct
>  {
>   unsigned char b0 : 1;
>   unsigned char b1 : 1;
>   unsigned char b2 : 1;
>   unsigned char b3 : 1;
>   unsigned char b4 : 1;
>   unsigned char b5 : 1;
>   unsigned char b6 : 1;
>   unsigned char b7 : 1;
>  };
>  
> };
>


Этот код компилироваться не обязан: стандарт подобного не разрешает.
Posted via RSDN NNTP Server 1.9 alpha
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[4]: Биты, байты...
От: ArtDenis Россия  
Дата: 01.06.04 16:22
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Этот код компилироваться не обязан: стандарт подобного не разрешает.


Хм... А по какой причине?
... << RSDN@Home 1.1.2 stable >>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[5]: Биты, байты...
От: Павел Кузнецов  
Дата: 01.06.04 16:37
Оценка:
> ПК>Этот код компилироваться не обязан: стандарт подобного не разрешает.
>
> Хм... А по какой причине?

Вопрос в другом: а по какой причине он должен был бы это поддерживать? Впрочем, учитывая широкое фактическое распространение этой "фичи", она вполне может попасть в одну из будущих версий языка.
Posted via RSDN NNTP Server 1.9 alpha
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[6]: Биты, байты...
От: ArtDenis Россия  
Дата: 01.06.04 16:47
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Вопрос в другом: а по какой причине он должен был бы это поддерживать? Впрочем, учитывая широкое фактическое распространение этой "фичи", она вполне может попасть в одну из будущих версий языка.


А почему тогда эта фича есть у Страуструпа в "Специальном издании"?
... << RSDN@Home 1.1.2 stable >>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[7]: Биты, байты...
От: ArtDenis Россия  
Дата: 01.06.04 16:54
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>А почему тогда эта фича есть у Страуструпа в "Специальном издании"?


Извиняюсь, спутал анонимные структуры с аномнимными объединениями
... << RSDN@Home 1.1.2 stable >>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[7]: Биты, байты...
От: Tosha Россия  
Дата: 01.06.04 19:52
Оценка:
Есть еще bitset<>
Например так bitset<8>b;
b[0]=1;
b[1]=0;
и т.д
... << RSDN@Home 1.1.3 stable >>
Re[3]: Биты, байты...
От: Михаил  
Дата: 02.06.04 06:40
Оценка:
Здравствуйте, Tosha, Вы писали:

T>А если без инициализации?

T>Допустим из порта считали байт, записали его в переменную read типа BYTE;
T>А дальше?

АШ>>
АШ>>// получение старших четырех бит
АШ>>byte hi = (0xF0 & b) >> 4;
АШ>>


T>Как тут быть?

T>Может так: BYTE hi=read>>4;?

Посмотри как определены макросы
HIBYTE, LOBYTE, HIWORD, MAKEWORD и т.д.
Просто и доступно.
...А отсюда наливаем, когда рецепт написан совсем неразборчиво...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.