![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Streng |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 27.4.2006 Репутация: нет Всего: нет |
У меня есть 2-х байтовое знаковое целое число. Мне нужно инвертировать в нем каждый четный бит... Как это сделать в с++?
|
|||
|
||||
| LPBOY |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Самое простое, что у меня получилось, это вот так:
--------------------
Каждый человек по-своему прав, а по-моему нет... |
|||
|
||||
| likehood |
|
|||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
А можно и так:
|
|||
|
||||
| LPBOY |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Действительно...
Только разве не так?
--------------------
Каждый человек по-своему прав, а по-моему нет... |
|||
|
||||
| likehood |
|
|||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
Если биты отсчитывать с нуля, то да.
|
|||
|
||||
| Streng |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 27.4.2006 Репутация: нет Всего: нет |
Не получается
Например беру число 546-в двоичном виде это 1000100010 В ответе получается 22391 это 101011101110111 |
|||
|
||||
| likehood |
|
|||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
Как же не получается? Каждый четный бит (крайний правый бит нулеовй, т.е. четный) и вправду инвертирован, а нечетные биты не тронуты. Что тебе не нравится?
|
|||
|
||||
| Streng |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 27.4.2006 Репутация: нет Всего: нет |
А разьве ответ должен быть не 1101110111? Откуда столько лишних разрядов?
|
|||
|
||||
| likehood |
|
|||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
Инвертируются все два байта, а не только нужная тебе часть числа (твое число дополняется слева нулями до 2-х байт).
|
|||
|
||||
| Streng |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 27.4.2006 Репутация: нет Всего: нет |
А реально сделать так чтобы инвертировались четные байты только в самом числе?
|
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
главное правильная маска - и инвертируй что хочешь.
абсолютно непонятно что ты хочешь сделать Это сообщение отредактировал(а) Fazil6 - 4.5.2006, 13:32 |
|||
|
||||
| likehood |
|
|||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
Надо сначала узнать где находится крайняя левая еденица, для этого надо последовательно сравнивать число с 0x0001, 0x0002, 0x004, 0x008 и т.д. Затем надо сформировать нужную маску. Только зачем тебе это надо?
|
|||
|
||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
тогда уж лучне начать слева, чем справа. т.е. сравнивать с 0x8000 , 0x4000 , 0x2000 , 0x1000 , 0x0800 ..и т.д. |
|||
|
||||
| likehood |
|
|||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
Чем это лучше? Для данного числа пожалуй, но в общем случае - все равно.
|
|||
|
||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
baronp,
если идти справа налево, но для того чтобы найти левую границу надо будет пройти ВСЕ число. а если идти слева направо, до достаточно найти 1-й установленный разряд. этим и лучше. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |