Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с битами 
V
    Опции темы
gorillka
Дата 21.2.2011, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



Такая проблемка. есть переменная тип unsigned char нужно с прочитать из неё заданный бит. решил делать так:
а=b<<7-1>>7 , 1- это номер бита, то есть сначала сдвигаю налево, потом направо.
например b=10101010. Только вот когда я сдвигаю влево  (а=b<<7-1) вместо ожидаемого результата
a=10000000
получаю
а=1010101000000
может я что-то не так делаю... или может есть более простой способ прочитать бит из байта?

Добавлено через 4 минуты и 5 секунд
пишу на builder 2009. я сначала подумал что переменная типа char не одно байтовая, а двух байтовая (начиная с версии 2009 они там что то намудрили) но такое действие a= b<<15-1, где b=10101010 даёт такой результат: a=101010100000000000000
PM MAIL   Вверх
UniBomb
Дата 21.2.2011, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 97



Когда вы делаете "b<<7-1", то вы выходите за рамки 8-ми бит, поэтому результат преобразовывается до как минимум двухбайтной величины. Да и непонятно зачем вы это делаете  smile 

Код

#define ololo_bit 1 //нужный бит
a = (b&1<<ololo_bit)>>ololo_bit;


Это сообщение отредактировал(а) UniBomb - 21.2.2011, 10:53
PM MAIL ICQ Skype   Вверх
gorillka
Дата 21.2.2011, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



Большое человеческое спасибо! так работает smile
PM MAIL   Вверх
Nat
Дата 21.2.2011, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 16.4.2007

Репутация: нет
Всего: нет



Если значение бита необходимо для проверки в if-e, то подойдет и такой код:
Код

char a

if(a & 0x04)         //смотрится значение второго бита
{
    ...
}


PM MAIL   Вверх
mes
Дата 21.2.2011, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(UniBomb @  21.2.2011,  09:52 Найти цитируемый пост)
a = (b&1<<ololo_bit)>>ololo_bit;

не много ли лишнего ?
Код

а= (b>>ololo_bit) & 1;

 smile 

Цитата(Nat @  21.2.2011,  15:04 Найти цитируемый пост)
if (a & 0x04)

предчувствую вопрос тс: "а откуда взялось 0x4?"
 smile 



--------------------
PM MAIL WWW   Вверх
UniBomb
Дата 21.2.2011, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 97



Цитата(mes @  21.2.2011,  16:15 Найти цитируемый пост)
не много ли лишнего ?

Написал как будто прям катастрофа, тысячу строчек кода вместо одной. Я писал так, что бы было похоже на вариант ТС, что бы он понял, а оптимизацией в дальнейшем можно играться сколько угодно.

Добавлено через 16 секунд
И да, забыл смайл -  smile 
PM MAIL ICQ Skype   Вверх
mes
Дата 21.2.2011, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(gorillka @  21.2.2011,  09:36 Найти цитируемый пост)
 есть переменная тип unsigned char 

у Вас а судя по всему не этого типа. smile



--------------------
PM MAIL WWW   Вверх
gorillka
Дата 22.2.2011, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



Еще вопросик по битам и байтам если можно   smile
У меня есть число оно очень большое занимает 4 байта
можно его как нибудь засунуть в 4 разные переменные (char) а потом обратно склеить

PM MAIL   Вверх
Nat
Дата 22.2.2011, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 16.4.2007

Репутация: нет
Всего: нет



Попробуй объединение union
Код

union Union_Name
{
       long     w;              //4-х байтовое слово
       char     ch[4];         //массив однобайтовых переменных
};

Объединение - частный случай структуры. Может содержать в одной  и той же области данных взаимоисключающие данные разных типов.

Это сообщение отредактировал(а) Nat - 22.2.2011, 08:51
PM MAIL   Вверх
UniBomb
Дата 22.2.2011, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 97



Цитата(gorillka @  22.2.2011,  08:21 Найти цитируемый пост)
У меня есть число оно очень большое занимает 4 байтаможно его как нибудь засунуть в 4 разные переменные (char) а потом обратно склеить

Этот вопрос обмусоливался вот в этой теме. Там было предложено много вариантов  smile 
PM MAIL ICQ Skype   Вверх
gorillka
Дата 22.2.2011, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



Спасибо посмотрю smile 
PM MAIL   Вверх
gorillka
Дата 22.2.2011, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



Цитата

Цитата(gorillka @  22.2.2011,  08:21 Найти цитируемый пост)
У меня есть число оно очень большое занимает 4 байтаможно его как нибудь засунуть в 4 разные переменные (char) а потом обратно склеить

Этот вопрос обмусоливался вот в этой теме. Там было предложено много вариантов  smile 



Посмотрел я что там пишут. ничего не понравилось smile
я сделал так:

склейка в одну переменную 4-х байт
Код

unsigned char a[3];
unsigned long b;
int i;

b=0;
for(i=0;i<4;i++)
    {
    b+=a[i]<<i*8;
    }
ShowMessage(FloatToStr(b));


вот так обратно разрубаю smile
Код

unsigned char d[3];
unsigned long c,e;
int i;

for(i=0;i<4;i++)
    {
    e=c;
    c=c>>8;
    c=c<<8;
    d[i]=e-c;
    c=c>>8;
    ShowMessage(FloatToStr(d[i]));
    }


помойму так намного проще smile

Это сообщение отредактировал(а) gorillka - 22.2.2011, 14:51
PM MAIL   Вверх
Nat
Дата 22.2.2011, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 16.4.2007

Репутация: нет
Всего: нет



Мсье знает толк в извращениях smile Хотя, дело вкуса, конечно.
PM MAIL   Вверх
UniBomb
Дата 22.2.2011, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 97



gorillka, ну коли уж вы не внемли тем советам (например про использование memcpy), то хотя бы поисправляйте "unsigned char a[3];" на "unsigned char a[4];"  smile 
PM MAIL ICQ Skype   Вверх
gorillka
Дата 24.2.2011, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



да с массивом на косячил не давно на Си перешло с паскаля smile а memcpy не с стал использовать потому что хотел чтоб код работал не только на c++ builder но и на микроконтроллере. а два разных кода писать мне лень smile (сдвиги и там и там без проблем работают, а вот библиотек там таких может и не оказаться).
но это так в мое оправдание smile
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0730 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.