Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
1 / 1 / 0
Регистрация: 18.03.2015
Сообщений: 10
1

С, битовая запись

18.03.2015, 14:42. Просмотров 2973. Ответов 20
Метки нет (Все метки)

Всем доброго времени суток, после 3 дней поиска информации решил попытать счастье, задав вопрос у форумчан. так же читал много подобных вопросов, но в свою очередь, сформулированы они были не читабельно. Итак, начну.
есть переменная, длиной в 1 байт, значение которой записано в шестнадцатеричнной системе.
i=0xAA;
далее нужно взять переменную и значение каждого из 8ми (0-7) байтов поместить в отдельные переменные.
я пытался осуществить это как-то так:
i|=(a=0)|(b=1)|(c=2)|(d=3)|(i=4)|(f=5)|(g=6)|(g=7); // НЕПРАВИЛЬНО
в общем такой вариант не сработал, хотя установка отдельных битов по такому принципу работает:
i|=(1<<0)|(1<<2);

Ребят, кто знает что-нибудь - поделитесь информацией, заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.03.2015, 14:42
Ответы с готовыми решениями:

Битовая маска
Как в шифровании битовыми перестановками применить маску?

битовая маска
надо разработать функцию проверки правильности битовой маски. 32-х битная “маска” считается...

битовая маска
как использовать битовую маску? за пример можно взять выделение k-того разряда из n-разрядного...

Битовая математика
Всем привет, кто бы мог растолковать инверсию. Потому как я не понимаю как при not 9...

20
Модератор
Эксперт С++
9927 / 8445 / 5134
Регистрация: 18.12.2011
Сообщений: 22,619
18.03.2015, 14:51 2
C++
1
2
3
4
5
6
7
8
unsigned char separate[8];
unsigned char x=0xAA,t;
t=x;
for(int i=0;i<8;i++)
{
    separate[i]= t & 0x01; // отделяем правый бит
    t>>=1; // сдвигаем число вправо на 1 бит
}
0
Эксперт С++
4964 / 3070 / 456
Регистрация: 10.11.2010
Сообщений: 11,159
Записей в блоге: 10
18.03.2015, 14:52 3
C++
1
2
3
4
5
6
    uint8_t i = 0xaa;
 
    uint8_t bit1 = (i >> 0) & 1; // сдвиг для наглядности
    uint8_t bit2 = (i >> 1) & 1;
    uint8_t bit3 = (i >> 2) & 1;
    ...
0
1 / 1 / 0
Регистрация: 18.03.2015
Сообщений: 10
18.03.2015, 16:10  [ТС] 4
castaway, zss, спасибо за помощь, но не подходит. биты не записались(
0
Эксперт С++
4964 / 3070 / 456
Регистрация: 10.11.2010
Сообщений: 11,159
Записей в блоге: 10
18.03.2015, 16:16 5
Цитата Сообщение от MAKAPOB Посмотреть сообщение
биты не записались(
Записались. Готов поспорить на 999 русских рублей.
0
1 / 1 / 0
Регистрация: 18.03.2015
Сообщений: 10
18.03.2015, 16:22  [ТС] 6
castaway, хм. первый бит переменной i записался в переменную 1bit? тоесть в bit1=0, bit2=1, и так далее?
просто работаю в avr. watch не работает почему-то, поэтому слежу за переменными через протеус, и там все очень плохо
0
Эксперт С++
4964 / 3070 / 456
Регистрация: 10.11.2010
Сообщений: 11,159
Записей в блоге: 10
18.03.2015, 16:27 7
bit1 = 0
bit2 = 1
bit3 = 0
и т.д.
0
1 / 1 / 0
Регистрация: 18.03.2015
Сообщений: 10
18.03.2015, 16:36  [ТС] 8
castaway, тогда позвольте, если я в конец не оборзел узнать как совержить обратную операцию?
допустим есть:
bit1 = 0
bit2 = 1
bit3 = 0
bit4 = 1
bit5 = 0
bit6 = 1
bit7 = 0
bit8 = 1

и после поместить в правильном порядке все в переменную d допустим.
по сути получается что приравняли i=d, но смысл в том, что мне нужны будут определенные биты для формул,
из-за этого и заморочка такая.
0
Эксперт С++
4964 / 3070 / 456
Регистрация: 10.11.2010
Сообщений: 11,159
Записей в блоге: 10
18.03.2015, 16:45 9
C++
1
    uint8_t byte = (bit8 << 7) | (bit7 << 6) | (bit6 << 5) | (bit5 << 4) | (bit4 << 3) | (bit3 << 2) | (bit2 << 1) | bit1;
1
1 / 1 / 0
Регистрация: 18.03.2015
Сообщений: 10
18.03.2015, 17:22  [ТС] 10
castaway, иду пробовать, спасибо большое

Добавлено через 36 минут
[castaway, извините за настырность, а связаться с вами тет-а-тет возможно или вы только на форуме предпочитаете сидеть?
0
Эксперт С++
4964 / 3070 / 456
Регистрация: 10.11.2010
Сообщений: 11,159
Записей в блоге: 10
18.03.2015, 17:31 11
Цитата Сообщение от MAKAPOB Посмотреть сообщение
castaway, извините за настырность, а связаться с вами тет-а-тет возможно или вы только на форуме предпочитаете сидеть?
Иногда я люблю сидеть в кафешке с пивком, но это тебе далеко придётся ехать.
А чем форум не устраивает? Связаться тет-а-тет это как?
0
1 / 1 / 0
Регистрация: 18.03.2015
Сообщений: 10
18.03.2015, 17:38  [ТС] 12
castaway, ну почта или соц сеть, устраивает, просто мне кажется, что больно тут не удобно, уже много раз один вопрос мусолится
0
Эксперт С++
4964 / 3070 / 456
Регистрация: 10.11.2010
Сообщений: 11,159
Записей в блоге: 10
18.03.2015, 17:48 13
MAKAPOB, лучше всё-таки сюда. В соц. сетях я давно не был, почта у меня долго грузится из-за медленного интернета.
Просто задавай вопросы которые тебя интересуют, желательно для каждого вопроса создавать отдельную тему.
Если все твои вопросы подобны этому, то ответы на них можно получить довольно быстро.
0
1 / 1 / 0
Регистрация: 18.03.2015
Сообщений: 10
20.03.2015, 21:35  [ТС] 14
castaway,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <avr/io.h>
int main(void)
{
uint8_t bit1,bit2,bit3,bit4,bit5,bit6,bit7,bit8;
unsigned char i = 0xAA;
  bit1 = (i >> 0);
  bit2 = (i >> 1);
  bit3 = (i >> 3);
  bit4 = (i >> 4);
  bit5 = (i >> 5);
  bit6 = (i >> 6);
  bit7 = (i >> 7);
  bit8 = (i >> 8);  
unsigned char d;
d|=(bit8 << 7) | (bit7 << 6) | (bit6 << 5) | (bit5 << 4) | (bit4 << 3) | (bit3 << 2) | (bit2 << 1) | (bit1 << 0);
PORTB=d;
}
бился-бился, вот последний вариант и все равно не идет, посмотрите если будет время? спасибо заранее)
0
Модератор
Эксперт по электронике
8285 / 6143 / 823
Регистрация: 14.02.2011
Сообщений: 21,356
20.03.2015, 21:41 15
Цитата Сообщение от MAKAPOB Посмотреть сообщение
биты не записались(
бита Си не поддерживает
можешь прочитать что есть битовые поля
Цитата Сообщение от MAKAPOB Посмотреть сообщение
просто работаю в avr.
это отдельная песня
диалект языка для AVRки поддерживает работу с битами, поскольку дозволяет процессор
но массив битов ты создать не можешь, если интересует почему открой описания камня и его карту памяти
да и код будет непереносим
0
1 / 1 / 0
Регистрация: 18.03.2015
Сообщений: 10
20.03.2015, 21:45  [ТС] 16
ValeryS, про битовые поля нашел только замену на 1 и обнуление умножением на ноль, но как же мне считать бит по отдельности? программно никак получается?
0
Модератор
Эксперт по электронике
8285 / 6143 / 823
Регистрация: 14.02.2011
Сообщений: 21,356
20.03.2015, 21:50 17
Цитата Сообщение от MAKAPOB Посмотреть сообщение
uint8_t bit1,bit2,bit3,bit4,bit5,bit6,bit7,bit8;
а где же здесь биты??? ты объявил байты
для битов есть ключевое слово bit
C
1
2
3
4
5
6
7
8
  bit1 = (i >> 0);// записывается 0xAA
  bit2 = (i >> 1);// записывается 0x55
  bit3 = (i >> 3);// записывается 0x2A
  bit4 = (i >> 4);// записывается 0x15
  bit5 = (i >> 5);// записывается 0x0A
  bit6 = (i >> 6);// записывается 0x05
  bit7 = (i >> 7);// записывается 0x02
  bit8 = (i >> 8); // записывается 0x01
нужно выделять младший бит
C
1
2
3
4
5
6
7
8
  bit1 = (i >> 0)&0x01;// записывается 0x00
  bit2 = (i >> 1)&0x01;// записывается 0x01
  bit3 = (i >> 3)&0x01;// записывается 0x00
  bit4 = (i >> 4)&0x01;// записывается 0x01
  bit5 = (i >> 5)&0x01;// записывается 0x00
  bit6 = (i >> 6)&0x01;// записывается 0x01
  bit7 = (i >> 7)&0x01;// записывается 0x00
  bit8 = (i >> 8)&0x01; // записывается 0x01
Добавлено через 1 минуту
Цитата Сообщение от MAKAPOB Посмотреть сообщение
программно никак получается?
ты хочешь стандартно?
вот например прочитать второй бит
C
1
a=(b&0x01)!=0;
Добавлено через 1 минуту
Цитата Сообщение от MAKAPOB Посмотреть сообщение
про битовые поля нашел только замену на 1 и обнуление умножением на ноль, но как же мне считать бит по отдельности?
ты видать не там читал
http://www.c-cpp.ru/books/bitovye-polya
0
1 / 1 / 0
Регистрация: 18.03.2015
Сообщений: 10
20.03.2015, 21:51  [ТС] 18
Цитата Сообщение от ValeryS Посмотреть сообщение
нужно выделять младший бит
Код C
1
2
3
4
5
6
7
8
* bit1 = (i >> 0)&0x01;// записывается 0x00
* bit2 = (i >> 1)&0x01;// записывается 0x01
* bit3 = (i >> 3)&0x01;// записывается 0x00
* bit4 = (i >> 4)&0x01;// записывается 0x01
* bit5 = (i >> 5)&0x01;// записывается 0x00
* bit6 = (i >> 6)&0x01;// записывается 0x01
* bit7 = (i >> 7)&0x01;// записывается 0x00
* bit8 = (i >> 8)&0x01; // записывается 0x01
пробовал так записывать, но я не правильно понял смысл. в итоге все равно как и тогда получилось вместо 0хАА получилось 0х6А. я сейчас перепроверил
0
Эксперт С++
4964 / 3070 / 456
Регистрация: 10.11.2010
Сообщений: 11,159
Записей в блоге: 10
20.03.2015, 21:56 19
MAKAPOB, ты пропустил третий бит в 14-м сообщении, между 7-й и 8-й строками.
Маска & 1 куда делась? Я не просто так её использовал.
У тебя проблем с внимательностью больше, чем с языком.
0
Модератор
Эксперт по электронике
8285 / 6143 / 823
Регистрация: 14.02.2011
Сообщений: 21,356
20.03.2015, 21:57 20
Цитата Сообщение от MAKAPOB Посмотреть сообщение
итоге все равно как и тогда получилось вместо 0хАА получилось 0х6А. я сейчас перепроверил
еще бы ты накосячил, а я дернул не глядя
сравни
Цитата Сообщение от MAKAPOB Посмотреть сообщение
C
1
2
3
4
5
6
7
8
bit1 = (i >> 0);
  bit2 = (i >> 1);
  bit3 = (i >> 3);//!!!!!!!!!!!!!!!!!!
  bit4 = (i >> 4);
  bit5 = (i >> 5);
  bit6 = (i >> 6);
  bit7 = (i >> 7);
  bit8 = (i >> 8);
и
C
1
2
3
4
5
6
7
8
 bit1 = (i >> 0)&0x01;
  bit2 = (i >> 1)&0x01;
  bit3 = (i >> 2)&0x01;
  bit4 = (i >> 3)&0x01;
  bit5 = (i >> 4)&0x01;
  bit6 = (i >> 5)&0x01;
  bit7 = (i >> 6)&0x01;
  bit8 = (i >> 7)&0x01;
обрати внимание на размер сдвига
у тебя сдвигается на 1 разряд а следующий на 3
а сдвиг на 8 вообще равен обнулению байта
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.03.2015, 21:57

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

Битовая маска
Добрый день! Подскажите пожалуйста вот с каким вопросом: У меня есть битовая маска. Допустим, 0000....

Битовая арифметика
Всем привет, может кто ниб поедлится любой прогой по переводу из одного бита в другой!!пожалуйста!

Битовая инверсия
Доброго времени суток! Я что-то запутался с побитовой инверсией. В коде прописываю int a=5;...

Битовая арифметика
Добрый день, форумчане! Как реализовать функцию или процедуру так, чтоб он обменял битами между...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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