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

Поиск:

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


Новичок



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

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



Привет форумчане smile
вот, решил всё-таки доделать начатое
обсуждение этой темы
возникла пробла с побитовыми операциями :(
Задача такая, у меня есть текст char textIn[], мне его нужно разбить на блоки по 3 байта, а затем эти 3 байта на слова по 3 бита, и заменить на слова из соответсвующего алфавита...

Воот что смог написать...
Код

#include   <stdio.h>
//  строку textIn нужно разбить на слова по 3 бита, и заменить их по опредилённому правилу
//т.к. слово у меня 3 бита мне нужно 3 флага.
const unsigned int MASK_A = 0;// ФЛАГ 1 на 0 бит
const unsigned int MASK_B = 1;//ФЛАГ 2 на 1 бит
const unsigned int MASK_C = 2;//ФЛАГ 3 на 2 бит

int main()
{
 unsigned char textIn[]="abcdefg";
 unsigned char buf[3];
 int textIn_i=0,buf_i=0,buf_j=0; 
 
 for (textIn_i,buf_i;textIn[textIn_i]!='\0';)
  {
     if (buf_i==3) 
    {
     //buf[3]='\0'; //Тут проблема, если убрать коммент,  printf выводит больше 3х
     // символов..как это может быть, ведь buf[3] у меня на всего для 3х, а печатает около 9-ти.
     printf("\n   %s    \n",buf);
     for (buf_j;buf_j!=8;buf_j++)//цикл по буферу, пока не изменим все 8 букв
     {    
       if ((buf & MASK_A)&&(buf & MASK_B)&&(buf & MASK_C) != 0)
        buf = ((buf & ~MASK_A)&&(buf & ~MASK_B)&&(buf & ~MASK_C));//если
        //первоеслово"111" ,то инвертируем его на "000"
        //и т.д. для остальных 7ми вариантов
         buf = buf<<3;//сдвигаем буфер
     }
     printf("\n   %s    \n",buf);//проверка результата
     buf_i=0;//обнуляем индекс буфера для дальнейшей записи
    }
      else
    {
     buf[buf_i]=textIn[textIn_i];
     buf_i++,textIn_i++;
    }
  }
return 0;
}


Вот что имею, как переводятся понимаю, а вот как ликвидировать эти ошибки Х.З. :( С битами\байтами раньше не приходлось работать...
Код

[defoult@localhost cryptography]$ gcc -o test test.c
test.c: In function ‘main’:
test.c:23: error: invalid operands to binary &
test.c:23: error: invalid operands to binary &
test.c:23: error: invalid operands to binary &
test.c:24: error: invalid operands to binary &
test.c:24: error: invalid operands to binary &
test.c:24: error: invalid operands to binary &
test.c:27: error: invalid operands to binary <<
[defoult@localhost cryptography]$     


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


Опытный
**


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

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



Цитата(Defoult @  26.12.2007,  03:21 Найти цитируемый пост)
unsigned int MASK_A = 0;


Цитата(Defoult @  26.12.2007,  03:21 Найти цитируемый пост)
char buf[3];


Цитата(Defoult @  26.12.2007,  03:21 Найти цитируемый пост)
buf & MASK_A

и т.д.
MASK_A 4 байта = 32 бита
buf 3 байта = 24 бита 
т.е. разные размерности  smile 



Это сообщение отредактировал(а) DigitSphinx - 26.12.2007, 07:28


--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
bsa
Дата 26.12.2007, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ошибка в том, что когда ты объявляешь char buf[3]; а потом используешь buf, то buf в большинстве случаев представляет собой указатель. А разве к указателю применима операция '&'?
Дальше, зачем разбивать на блоки по 3 байта? почему сразу нельзя оперировать битами? Для этого тебе надо всего лишь придумать указатель на бит (указатель на байт + номер бита) и логику работы с ним. В этом случае будет меньше проблем при переходе на другую архитектуру (например, big-endian).
PM   Вверх
DigitSphinx
Дата 26.12.2007, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(bsa @  26.12.2007,  11:45 Найти цитируемый пост)
buf в большинстве случаев представляет собой указатель.

но указатель это 4 байта (DWORD переменная) т.е. с ней можно проделывать логические операции ?!


--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
bsa
Дата 26.12.2007, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



DigitSphinx, да что ты? А почему умножать указатели нельзя, ведь это просто DWORD?
PM   Вверх
Defoult
Дата 26.12.2007, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

почему сразу нельзя оперировать битами?

накладывать маску на textIn[], и потом <<3

Цитата

Для этого тебе надо всего лишь придумать указатель на бит (указатель на байт + номер бита)

 не фтыкаю...smile 


а всё-таки, как мне решить проблему в моём коде?
PM MAIL ICQ   Вверх
DigitSphinx
Дата 26.12.2007, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



bsa, не пробовал не знаю    smile 


--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
archimed7592
Дата 26.12.2007, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(Defoult @  26.12.2007,  19:29 Найти цитируемый пост)
не фтыкаю... smile

Пример есть в STL. bitset называется. Правда, это С++.

Добавлено через 18 секунд
DigitSphinx, ты их хотя бы сложить попробуй 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, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



archimed7592, значит, то что я написал - ерунда? И без указателей никак не обойтись?
PM MAIL ICQ   Вверх
archimed7592
Дата 26.12.2007, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(Defoult @  26.12.2007,  21:13 Найти цитируемый пост)
archimed7592, значит, то что я написал - ерунда? И без указателей никак не обойтись?

Не совсем понял, откуда ты сделал такой вывод...
Вот простой пример, как узнать значение определённого бита:
Код

int getBit(const void *buf, size_t n)
{
    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;
    int result = (c >> bn) & 1;

    return result;
}



--------------------
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   Вверх
DigitSphinx
Дата 26.12.2007, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



 smile 
Код

DWORD a, b;
int * i = new int;
a = (DWORD)i * (DWORD)i;
b = (DWORD)i + (DWORD)i;

компилиться  smile   smile 


--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
bsa
Дата 26.12.2007, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



DigitSphinx, и что будет? Каков тайный смысл операции? Что будет если умножить номер одного дома на номер другого?
прекращай цирк.
PM   Вверх
archimed7592
Дата 26.12.2007, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



DigitSphinx, а ты не задавался вопросом, почему указатели можно вычитать(без преобразований) или складывать/вычитать с числом?

Цитата(bsa @  26.12.2007,  22:15 Найти цитируемый пост)
Что будет если умножить номер одного дома на номер другого?

smile


M
archimed7592
Цитата(bsa @  26.12.2007,  22:15 Найти цитируемый пост)
прекращай цирк. 

Поддерживаю.


Это сообщение отредактировал(а) archimed7592 - 26.12.2007, 22:22


--------------------
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, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

В основном побитовые операции применяются для манипуляций с битовыми масками. Например, пусть целое число x описывает набор признаков некоторого объекта, состоящий из четырех признаков. Назовем их условно A, B, C, D. Пусть за признак A отвечает нулевой бит слова x (биты в двоичном представлении числа нумеруются справа налево, начиная с нуля). Если бит равен единице (программисты говорят бит установлен), то считается, что объект обладает признаком A. За признаки B, C, D отвечают биты с номерами 1, 2, 3. Общепринятая практика состоит в том, чтобы определить константы, отвечающие за соответствующие признаки (их обычно называют масками): 
const int MASK_A = 1;
const int MASK_B = 2;
const int MASK_C = 4;
const int MASK_D = 8;

Эти константы содержат единицу в соответствующем бите и нули в остальных битах. Для того чтобы проверить, установлен ли в слове x бит, соответствующий, к примеру, признаку D, используется операция побитового логического умножения. Число x умножается на константу MASK_D; если результат отличен от нуля, то бит установлен, т.е. объект обладает признаком D, если нет, то не обладает. Такая проверка реализуется следующим фрагментом: 
 
if ((x & MASK_D) != 0) {
    // Бит D установлен в слове x, т.е.
    // объект обладает признаком D
    . . .
} else {                                                                              
    // Объект не обладает признаком D
    . . .
}


А так что, нельзя?

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


Архимед
****


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

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



Цитата(Defoult @  26.12.2007,  22:34 Найти цитируемый пост)
А так что, нельзя?

Можно, но, в таком случае x должен представлять из себя интегральный тип(char, int и пр.), а не массив или указатель.
Поверь, приведённая мною ф-ция многим проще в применении, чем метод, предложенный в твоей цитате.


--------------------
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: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   Вверх
Defoult
Дата 27.12.2007, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



понятно...

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


Эксперт
****


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

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



Если убрать лишнюю скобку и лишнюю опарацию |MASK (так как MASK = 0), то получится c = c << bn, что эквивалентно: c <<= bn - сдвиг c на bn бит влево.
PM   Вверх
Defoult
Дата 27.12.2007, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



фсё понял, спасибо smile
PM MAIL ICQ   Вверх
Bro058
Дата 3.2.2010, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



День добрый. smile  
Объясните дилетанту(то бишь мне) следующую вещь: тип int в С++ занимает 4 Байта, прав ли я в следующем:

1) любая переменная типа int в бинарном коде будет выглядеть как набор 0 и 1 в 32-значном числе..

2) самое последнее(максимальное) число типа int в бинарном коде выглядеть будет так: 1111 1111 1111 1111 1111 1111 1111 1111...

3) для того что бы узнать бинарный код числа типа int надо перевести его в двоичную систему исчисления


Цитата

если кто-то пообещал Вам что всё будет хорошо и это сбылось, значит это был Господь Бог... 

PM MAIL   Вверх
bsa
Дата 3.2.2010, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



0. Размер типа int может быть и не 4 байта. В 16-ти битных ОС он 16-ти битный, например.
1. Любая переменная будет выглядеть как набор бит.
2. тип int - это знаковый тип, т.е. его значения лежать от INT_MIN до INT_MAX включительно (причем ни то, ни другое значение не выглядят как ты показал).
3. не очень понятно, вообще-то. если тебе нужно представление в двоичной системе счисления, то нужно переводить. В любом случае, все эти заморочки нужны лишь для того, чтобы человеку было наглядно.

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

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

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

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

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


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

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


 




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


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

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