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

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

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

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

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


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

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


 




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


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

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