Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> побитовые операции, работа с битами 
:(
    Опции темы
Defoult
Дата 26.12.2007, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

........
if (getBit(buf,0) != 0)  //передаю в функцию буфер, и номер бита
 buf = (setBit(buf,0,1);  //заменяю 0 бит в буфере на "1"      
......


ТАК?
PM MAIL ICQ   Вверх
archimed7592
Дата 26.12.2007, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

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



Цитата(Defoult @  26.12.2007,  23:00 Найти цитируемый пост)
ТАК? 

Так, только setBit тебе ещё написать придётся smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Defoult
Дата 26.12.2007, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



а так не прохляет? smile 
PM MAIL ICQ   Вверх
Defoult
Дата 26.12.2007, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

char setBit(const void *buf, size_t n,int flag)//flag, для того, что бы узнать на что заменить
{
    const unsigned char *cb = (const unsigned char *)buf;
    const unsigned char *cb2 = cb + n / CHAR_BIT;
    size_t bn = n % CHAR_BIT;
    unsigned char c = *cb2;
    if (flag=1)
                   char result = (c >> bn) | 1;  //заменить бит на "1"
                   else
                    char result = (c >> bn) | 0;//заменить бит на "1"
    return buf;

}


писал чисто интуиитовно..... даже не компилил...боюсь smile
archimed7592 посмотри...
PM MAIL ICQ   Вверх
archimed7592
Дата 26.12.2007, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

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




 ! 
archimed7592
Ksenia_Kon, один топик - один вопрос. Тема разделена в Поменять четные цифры и нечетные местами.


Defoult, что должна возвращать ф-ция setBit? Какой смысл будет нести это возвращаемое значение?


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Defoult
Дата 26.12.2007, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ну как.....возвращаем буфер, в котором указанный бит заменили на опредилённый "0" или "1"...
Код

char setBit(const void *buf, size_t n,int flag)//flag, для того, что бы узнать на что заменить
{
    const unsigned char *cb = (const unsigned char *)buf;
    const unsigned char *cb2 = cb + n / CHAR_BIT;
    size_t bn = n % CHAR_BIT;
    unsigned char c = *cb2;
    if (flag=1)
                   char buf = (c >> bn) | 1;  //заменить бит на "1"
                   else
                    char buf = (c >> bn) | 0;//заменить бит на "0"
    return buf;


}


млин, копи паст рулит smile только я невнимательный, сори...

Это сообщение отредактировал(а) Defoult - 26.12.2007, 23:30
PM MAIL ICQ   Вверх
archimed7592
Дата 26.12.2007, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

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



Ок, поставлю вопрос немного иначе: зачем ей вообще что-то возвращать? getBit - взять бит, т.е. ф-ция должна его вернуть. А setBit - установить бит - что в таком случае ещё возвращать нужно?

Ещё такой момент: const void *buf - это указатель на неизменяемую область память. getBit незачем изменять эту область, потому там и const. А setBit должна изменять эту область - соответственно с const что нужно сделать?


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Defoult
Дата 26.12.2007, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

void setBit([color=red]void (или char, мы ведь передаём строку...)???[/color] *buf, size_t n,int flag)//flag, для того, что бы узнать на что заменить
{
    const unsigned char *cb = (const unsigned char *)buf;
    const unsigned char *cb2 = cb + n / CHAR_BIT;
    size_t bn = n % CHAR_BIT;
    unsigned char c = *cb2;
    if (flag=1)
                   char buf = (c >> bn) | 1;  //заменить бит на "1"
                   else
                    char buf = (c >> bn) | 0;//заменить бит на "0"
    return NULL;
}


Вродь понял, мы передаём буфер прямо в функцию, и там его обрабатываем...
"Наверное так!", сказал тов. Ленин... smile 

Это сообщение отредактировал(а) Defoult - 26.12.2007, 23:55
PM MAIL ICQ   Вверх
archimed7592
Дата 26.12.2007, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

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



Отлично, только ты убрал const из прототипа, а из самого кода не убрал(ты же именно там и будешь менять значение байта).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
bsa
Дата 27.12.2007, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Defoult, лучше скомпилируй и, когда у тебя это получится, отладь.
PM   Вверх
Defoult
Дата 27.12.2007, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

void setBit(void *buf, size_t n,int flag)//flag, для того, что бы узнать на что заменить
{
    unsigned char *cb = (unsigned char *)buf;
    unsigned char *cb2 = cb + n / CHAR_BIT;
    size_t bn = n % CHAR_BIT;
    unsigned char c = *cb2;
    .......
}


млин, я пока толком и не понимаю как полностью работает эта функция...
 char *cb - это указатель cb типа char  на buf типа указатель на тип char, а зачем?
и что за тип данных size_t???
PM MAIL ICQ   Вверх
bsa
Дата 27.12.2007, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Defoult, char *cb - это лишь для удобства. Арифметические операции с типом void* невозможны.
cb2 - это смещенный указатель на (n/CHAR_BIT) байтов.
size_t - это стандартный тип, обозначающий размер. Например, unsigned long. Но лучше использовать именно size_t.
PM   Вверх
archimed7592
Дата 27.12.2007, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

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



Цитата(Defoult @  27.12.2007,  00:08 Найти цитируемый пост)
char *cb - это указатель cb типа char  на buf типа указатель на тип char, а зачем?

Ну как же зачем. Нам нужно определить в каком байте нужно заменить бит. В байте 8 бит. Т.е. при замене 10-го бита нужно изменять 1-й байт.
cb указывает на нулевой байт области памяти в который мы битами оперируем.
cb2 равен cb плюс 10 / 8 т.е. cb + 1 т.е. cb2 указывает на 1-й байт(то что нужно).

size_t - можешь считать, что это unsigned int.

Добавлено через 2 минуты и 39 секунд
Теперь смотри. У тебя есть 
Код
unsigned char c = ...;
И номер бита
Код
size_t bn = ...;
Как заменить в переменной c бит c номером bn на единицу?


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Defoult
Дата 27.12.2007, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ну как, сдвинуть с на bn, и записать в 0 бит единицу,
const int MASK = 0;
.....
c = ((c << bn) | MASK);
.....

Цитата

Для установки бита D в слове x используется операция побитового логического сложения: 
x = (x | MASK_D);   // Установить бит D в слове x




Это сообщение отредактировал(а) Defoult - 27.12.2007, 18:04
PM MAIL ICQ   Вверх
bsa
Дата 27.12.2007, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(Defoult @ 27.12.2007,  17:59)
ну как, сдвинуть с на bn, и записать в 0 бит единицу,
const int MASK = 0;
.....
c = (c << bn) | MASK);
.....

ой. кто так делает?
Установить бит bn в переменной c:
Код
c |= (1 << bn);

PM   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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