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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> инвертировать, каждый четный бит 
:(
    Опции темы
Streng
Дата 4.5.2006, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У меня есть 2-х байтовое знаковое целое число. Мне нужно инвертировать в нем каждый четный бит... Как это сделать в с++? 
PM MAIL   Вверх
LPBOY
Дата 4.5.2006, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Самое простое, что у меня получилось, это вот так:
Код

number = (number & 0xAAAA) | (~number & 0x5555);
 
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
likehood
Дата 4.5.2006, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

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



А можно и так:
Код

number ^= 0xAAAA;
 
PM MAIL   Вверх
LPBOY
Дата 4.5.2006, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Действительно...
Только разве не так?
Код

number ^= 0x5555;
 
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
likehood
Дата 4.5.2006, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

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



Если биты отсчитывать с нуля, то да. 
PM MAIL   Вверх
Streng
Дата 4.5.2006, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Не получается
Например беру число 546-в двоичном виде это 1000100010
В ответе получается 22391 это 101011101110111 
PM MAIL   Вверх
likehood
Дата 4.5.2006, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

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



Как же не получается? Каждый четный бит (крайний правый бит нулеовй, т.е. четный) и вправду инвертирован, а нечетные биты не тронуты. Что тебе не нравится? 
PM MAIL   Вверх
Streng
Дата 4.5.2006, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А разьве ответ должен быть не 1101110111? Откуда столько лишних разрядов? 
PM MAIL   Вверх
likehood
Дата 4.5.2006, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

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



Инвертируются все два байта, а не только нужная тебе часть числа (твое число дополняется слева нулями до 2-х байт). 
PM MAIL   Вверх
Streng
Дата 4.5.2006, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А реально сделать так чтобы инвертировались четные байты только в самом числе? 
PM MAIL   Вверх
Fazil6
Дата 4.5.2006, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



главное правильная маска - и инвертируй что хочешь. 
Цитата

А реально сделать так чтобы инвертировались четные байты только в самом числе? 

абсолютно непонятно что ты хочешь сделать 

Это сообщение отредактировал(а) Fazil6 - 4.5.2006, 13:32
PM MAIL   Вверх
likehood
Дата 4.5.2006, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

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



Надо сначала узнать где находится крайняя левая еденица, для этого надо последовательно сравнивать число с 0x0001, 0x0002, 0x004, 0x008 и т.д. Затем надо сформировать нужную маску. Только зачем тебе это надо? 
PM MAIL   Вверх
LuckLess
Дата 4.5.2006, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(baronp @  4.5.2006,  14:21 Найти цитируемый пост)
Надо сначала узнать где находится крайняя левая еденица, для этого надо последовательно сравнивать число с 0x0001, 0x0002, 0x004, 0x008 и т.д. Затем надо сформировать нужную маску. Только зачем тебе это надо?  

тогда уж лучне начать слева, чем справа.
т.е. сравнивать с 0x8000 , 0x4000 , 0x2000 , 0x1000 , 0x0800 ..и т.д. 
PM MAIL   Вверх
likehood
Дата 4.5.2006, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

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



Чем это лучше? Для данного числа пожалуй, но в общем случае - все равно. 
PM MAIL   Вверх
LuckLess
Дата 4.5.2006, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



baronp, 
если идти справа налево, но для того чтобы найти левую границу надо будет пройти ВСЕ число.
а если идти слева направо, до достаточно найти 1-й установленный разряд.
этим и лучше.
 
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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