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

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

18.03.2015, 14:42. Показов 6282. Ответов 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.03.2015, 14:42
Ответы с готовыми решениями:

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

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

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

20
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
18.03.2015, 14:51
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
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
18.03.2015, 14:52
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  [ТС]
castaway, zss, спасибо за помощь, но не подходит. биты не записались(
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
18.03.2015, 16:16
Цитата Сообщение от MAKAPOB Посмотреть сообщение
биты не записались(
Записались. Готов поспорить на 999 русских рублей.
0
1 / 1 / 0
Регистрация: 18.03.2015
Сообщений: 10
18.03.2015, 16:22  [ТС]
castaway, хм. первый бит переменной i записался в переменную 1bit? тоесть в bit1=0, bit2=1, и так далее?
просто работаю в avr. watch не работает почему-то, поэтому слежу за переменными через протеус, и там все очень плохо
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
18.03.2015, 16:27
bit1 = 0
bit2 = 1
bit3 = 0
и т.д.
0
1 / 1 / 0
Регистрация: 18.03.2015
Сообщений: 10
18.03.2015, 16:36  [ТС]
castaway, тогда позвольте, если я в конец не оборзел узнать как совержить обратную операцию?
допустим есть:
bit1 = 0
bit2 = 1
bit3 = 0
bit4 = 1
bit5 = 0
bit6 = 1
bit7 = 0
bit8 = 1

и после поместить в правильном порядке все в переменную d допустим.
по сути получается что приравняли i=d, но смысл в том, что мне нужны будут определенные биты для формул,
из-за этого и заморочка такая.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
18.03.2015, 16:45
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  [ТС]
castaway, иду пробовать, спасибо большое

Добавлено через 36 минут
[castaway, извините за настырность, а связаться с вами тет-а-тет возможно или вы только на форуме предпочитаете сидеть?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
18.03.2015, 17:31
Цитата Сообщение от MAKAPOB Посмотреть сообщение
castaway, извините за настырность, а связаться с вами тет-а-тет возможно или вы только на форуме предпочитаете сидеть?
Иногда я люблю сидеть в кафешке с пивком, но это тебе далеко придётся ехать.
А чем форум не устраивает? Связаться тет-а-тет это как?
0
1 / 1 / 0
Регистрация: 18.03.2015
Сообщений: 10
18.03.2015, 17:38  [ТС]
castaway, ну почта или соц сеть, устраивает, просто мне кажется, что больно тут не удобно, уже много раз один вопрос мусолится
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
18.03.2015, 17:48
MAKAPOB, лучше всё-таки сюда. В соц. сетях я давно не был, почта у меня долго грузится из-за медленного интернета.
Просто задавай вопросы которые тебя интересуют, желательно для каждого вопроса создавать отдельную тему.
Если все твои вопросы подобны этому, то ответы на них можно получить довольно быстро.
0
1 / 1 / 0
Регистрация: 18.03.2015
Сообщений: 10
20.03.2015, 21:35  [ТС]
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
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,857
20.03.2015, 21:41
Цитата Сообщение от MAKAPOB Посмотреть сообщение
биты не записались(
бита Си не поддерживает
можешь прочитать что есть битовые поля
Цитата Сообщение от MAKAPOB Посмотреть сообщение
просто работаю в avr.
это отдельная песня
диалект языка для AVRки поддерживает работу с битами, поскольку дозволяет процессор
но массив битов ты создать не можешь, если интересует почему открой описания камня и его карту памяти
да и код будет непереносим
0
1 / 1 / 0
Регистрация: 18.03.2015
Сообщений: 10
20.03.2015, 21:45  [ТС]
ValeryS, про битовые поля нашел только замену на 1 и обнуление умножением на ноль, но как же мне считать бит по отдельности? программно никак получается?
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,857
20.03.2015, 21:50
Цитата Сообщение от 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  [ТС]
Цитата Сообщение от 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
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
20.03.2015, 21:56
MAKAPOB, ты пропустил третий бит в 14-м сообщении, между 7-й и 8-й строками.
Маска & 1 куда делась? Я не просто так её использовал.
У тебя проблем с внимательностью больше, чем с языком.
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,857
20.03.2015, 21:57
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.03.2015, 21:57
Помогаю со студенческими работами здесь

Битовая математика
Всем привет, кто бы мог растолковать инверсию. Потому как я не понимаю как при not 9 получается -10 когда на бумаге: 9 = 1001 ...

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru