![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Defoult |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 16.9.2007 Где: Ростов-на-дону Репутация: нет Всего: нет |
Привет форумчане
![]() вот, решил всё-таки доделать начатое обсуждение этой темы возникла пробла с побитовыми операциями :( Задача такая, у меня есть текст char textIn[], мне его нужно разбить на блоки по 3 байта, а затем эти 3 байта на слова по 3 бита, и заменить на слова из соответсвующего алфавита... Воот что смог написать...
Вот что имею, как переводятся понимаю, а вот как ликвидировать эти ошибки Х.З. :( С битами\байтами раньше не приходлось работать...
Подскажите на правильном ли я пути( я имею ввиду работу с битами) и где у меня ошибки... |
||||
|
|||||
DigitSphinx |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 442 Регистрация: 28.4.2007 Где: Москва Репутация: нет Всего: 3 |
и т.д. MASK_A 4 байта = 32 бита buf 3 байта = 24 бита т.е. разные размерности ![]() Это сообщение отредактировал(а) DigitSphinx - 26.12.2007, 07:28 |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Ошибка в том, что когда ты объявляешь char buf[3]; а потом используешь buf, то buf в большинстве случаев представляет собой указатель. А разве к указателю применима операция '&'?
Дальше, зачем разбивать на блоки по 3 байта? почему сразу нельзя оперировать битами? Для этого тебе надо всего лишь придумать указатель на бит (указатель на байт + номер бита) и логику работы с ним. В этом случае будет меньше проблем при переходе на другую архитектуру (например, big-endian). |
|||
|
||||
DigitSphinx |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 442 Регистрация: 28.4.2007 Где: Москва Репутация: нет Всего: 3 |
но указатель это 4 байта (DWORD переменная) т.е. с ней можно проделывать логические операции ?! |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
DigitSphinx, да что ты? А почему умножать указатели нельзя, ведь это просто DWORD?
|
|||
|
||||
Defoult |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 16.9.2007 Где: Ростов-на-дону Репутация: нет Всего: нет |
накладывать маску на textIn[], и потом <<3
не фтыкаю... ![]() а всё-таки, как мне решить проблему в моём коде? |
||||
|
|||||
DigitSphinx |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 442 Регистрация: 28.4.2007 Где: Москва Репутация: нет Всего: 3 |
bsa, не пробовал не знаю
![]() |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 6 Всего: 93 |
Пример есть в STL. bitset называется. Правда, это С++. Добавлено через 18 секунд DigitSphinx, ты их хотя бы сложить попробуй ![]() -------------------- 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 |
|||
|
||||
Defoult |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 16.9.2007 Где: Ростов-на-дону Репутация: нет Всего: нет |
archimed7592, значит, то что я написал - ерунда? И без указателей никак не обойтись?
|
|||
|
||||
archimed7592 |
|
||||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 6 Всего: 93 |
Не совсем понял, откуда ты сделал такой вывод... Вот простой пример, как узнать значение определённого бита:
-------------------- 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 |
||||
|
|||||
DigitSphinx |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 442 Регистрация: 28.4.2007 Где: Москва Репутация: нет Всего: 3 |
![]()
компилиться ![]() ![]() |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
DigitSphinx, и что будет? Каков тайный смысл операции? Что будет если умножить номер одного дома на номер другого?
прекращай цирк. |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 6 Всего: 93 |
DigitSphinx, а ты не задавался вопросом, почему указатели можно вычитать(без преобразований) или складывать/вычитать с числом?
![]()
Это сообщение отредактировал(а) 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 |
|||
|
||||
Defoult |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 16.9.2007 Где: Ростов-на-дону Репутация: нет Всего: нет |
А так что, нельзя? Это сообщение отредактировал(а) Defoult - 26.12.2007, 22:36 |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 6 Всего: 93 |
Можно, но, в таком случае 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 |
|||
|
||||
Defoult |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 16.9.2007 Где: Ростов-на-дону Репутация: нет Всего: нет |
ТАК? |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 6 Всего: 93 |
-------------------- 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 |
|||
|
||||
Defoult |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 16.9.2007 Где: Ростов-на-дону Репутация: нет Всего: нет |
а так не прохляет?
![]() |
|||
|
||||
Defoult |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 16.9.2007 Где: Ростов-на-дону Репутация: нет Всего: нет |
писал чисто интуиитовно..... даже не компилил...боюсь ![]() archimed7592 посмотри... |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 6 Всего: 93 |
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 |
|||
|
||||
Defoult |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 16.9.2007 Где: Ростов-на-дону Репутация: нет Всего: нет |
Ну как.....возвращаем буфер, в котором указанный бит заменили на опредилённый "0" или "1"...
млин, копи паст рулит ![]() Это сообщение отредактировал(а) Defoult - 26.12.2007, 23:30 |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 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 |
|||
|
||||
Defoult |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 16.9.2007 Где: Ростов-на-дону Репутация: нет Всего: нет |
Вродь понял, мы передаём буфер прямо в функцию, и там его обрабатываем... "Наверное так!", сказал тов. Ленин... ![]() Это сообщение отредактировал(а) Defoult - 26.12.2007, 23:55 |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 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 |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Defoult, лучше скомпилируй и, когда у тебя это получится, отладь.
|
|||
|
||||
Defoult |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 16.9.2007 Где: Ростов-на-дону Репутация: нет Всего: нет |
млин, я пока толком и не понимаю как полностью работает эта функция... char *cb - это указатель cb типа char на buf типа указатель на тип char, а зачем? и что за тип данных size_t??? |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Defoult, char *cb - это лишь для удобства. Арифметические операции с типом void* невозможны.
cb2 - это смещенный указатель на (n/CHAR_BIT) байтов. size_t - это стандартный тип, обозначающий размер. Например, unsigned long. Но лучше использовать именно size_t. |
|||
|
||||
archimed7592 |
|
||||||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 6 Всего: 93 |
Ну как же зачем. Нам нужно определить в каком байте нужно заменить бит. В байте 8 бит. Т.е. при замене 10-го бита нужно изменять 1-й байт. cb указывает на нулевой байт области памяти в который мы битами оперируем. cb2 равен cb плюс 10 / 8 т.е. cb + 1 т.е. cb2 указывает на 1-й байт(то что нужно). size_t - можешь считать, что это unsigned int. Добавлено через 2 минуты и 39 секунд Теперь смотри. У тебя есть
-------------------- 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 |
||||||
|
|||||||
Defoult |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 16.9.2007 Где: Ростов-на-дону Репутация: нет Всего: нет |
ну как, сдвинуть с на bn, и записать в 0 бит единицу,
const int MASK = 0; ..... c = ((c << bn) | MASK); .....
Это сообщение отредактировал(а) Defoult - 27.12.2007, 18:04 |
|||
|
||||
bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
ой. кто так делает? Установить бит bn в переменной c:
|
||||
|
|||||
Defoult |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 16.9.2007 Где: Ростов-на-дону Репутация: нет Всего: нет |
понятно...
Это сообщение отредактировал(а) Defoult - 27.12.2007, 18:13 |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Если убрать лишнюю скобку и лишнюю опарацию |MASK (так как MASK = 0), то получится c = c << bn, что эквивалентно: c <<= bn - сдвиг c на bn бит влево.
|
|||
|
||||
Defoult |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 16.9.2007 Где: Ростов-на-дону Репутация: нет Всего: нет |
фсё понял, спасибо
![]() |
|||
|
||||
Bro058 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 28.1.2010 Репутация: нет Всего: нет |
День добрый.
![]() Объясните дилетанту(то бишь мне) следующую вещь: тип int в С++ занимает 4 Байта, прав ли я в следующем: 1) любая переменная типа int в бинарном коде будет выглядеть как набор 0 и 1 в 32-значном числе.. 2) самое последнее(максимальное) число типа int в бинарном коде выглядеть будет так: 1111 1111 1111 1111 1111 1111 1111 1111... 3) для того что бы узнать бинарный код числа типа int надо перевести его в двоичную систему исчисления
|
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
0. Размер типа int может быть и не 4 байта. В 16-ти битных ОС он 16-ти битный, например.
1. Любая переменная будет выглядеть как набор бит. 2. тип int - это знаковый тип, т.е. его значения лежать от INT_MIN до INT_MAX включительно (причем ни то, ни другое значение не выглядят как ты показал). 3. не очень понятно, вообще-то. если тебе нужно представление в двоичной системе счисления, то нужно переводить. В любом случае, все эти заморочки нужны лишь для того, чтобы человеку было наглядно. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |