![]() |
|
Модераторы: 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-й установленный разряд. этим и лучше. |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Берёшь своё число, определяешь следущую степень двойки, отнимаешь еденицу и делаешь &
где то так "с лёту" |
|||
|
||||
| likehood |
|
|||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
В итоге i содержит номер старшей еденицы числа х, только х конечно же беззнаковое (для операции сравнения), а не знаковое, как было заявлено. |
|||
|
||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
тоже самое, только быстрее.
Это сообщение отредактировал(а) LuckLess - 4.5.2006, 17:43 |
|||
|
||||
| likehood |
|
|||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
точно быстрее? мой цикл требует 7 итераций а твой 9 (7+9=16==sizeof(short))
|
|||
|
||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
посмотри сам.
во первых твой вариант давал неправельный результат. надо было в конце еще 1 битовый здвиг делать в обр. сторону. во вторых твой вариант не может работать с маской unsigned short , так как она переполняеться!! поэтому в примерах маска 4 байта. сделал и себе маску 4 байты , так как если сделать ее 2 , то вычисления становяться медленнее в 4-5 раз, чего и следовало ожидать. вот сравни результаты.
|
|||
|
||||
| likehood |
|
|||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
На счет переполнения - согласен, лучше маску делать с запасом.
Что касается дополнительного сдвига, то это зависит от того, что ты потом с этой маской будешь делать. Нам ведь нужна такая маска: ....10101010, а как ее получить в твоем алгоритме? Ведь не на основе же вычесленной mask'и. Скорость твоего варианта больше (в основном благодаря замене сравнения битовой операцией), это так. Но надо решить всю задачу целиком и сравнить, тогда и посмотрим. ЗЫ !(x&mask) - хорошо придумал, я бы так просто не догадался. |
|||
|
||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
чесно говоря я уже забыл зачем мы ее считали эту маску))
приду домой минут через 30, напишу полностью задачу)) и ты напиши. сравним скорости )) |
|||
|
||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
вот
Это сообщение отредактировал(а) LuckLess - 4.5.2006, 19:34 |
|||
|
||||
| likehood |
|
|||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
мой вариант:
|
|||
|
||||
| likehood |
|
||||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
Кстати, отличная идея - взять полную маску 0х5555 и обрезать нужное число разрядов.
Я то сначала хотел получать эту маску по одному биту в цикле, а тут взял...
...и никаких проблем! Добавлено @ 21:34 Что касается скорости, твой вариант где-то в 1.5 раза быстрее, так что и вправду лучше начинать со старших разрядов. Правда в твоем коде есть одна неточность, из-за чего иногда получается неверный результат. Вот мой вариант твоего кода:
Кстати, только щас заметил пост sergej.z'а, как же я его проглядел? Отличная идея - вычесть из маски 1 - намного красивее моего варианта. Но Func2 все же должен работать быстрее. |
||||
|
|||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
я чуть переделал.
так как с ошибкой было у меня моя функция выиграывет почти в 8 раз
Это сообщение отредактировал(а) LuckLess - 4.5.2006, 21:46 |
|||
|
||||
| likehood |
|
|||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
Выигрыш, конечно, зависит от компилера и его настроек, но все равно разница очевидна.
|
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
а так?
-------------------- qqq |
|||
|
||||
| Streng |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 27.4.2006 Репутация: нет Всего: нет |
Большое спасибо за помощь!!!
|
|||
|
||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
maxim1000,
результаты
8000 1000 2000 т.е. моя функция пока впереди планеты всей |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
странно
видать, что-то не то с измерением времени у меня Func2 было 480 Func3 - 90 (иначе я б и не написал её сюда) покопаюсь ещё... -------------------- qqq |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
А... всё понятно...
у меня была включена оптимизация на максимум и я убрал вывод rezult* умный компилятор, наверное, вообще выкинул все вычисления нннда... выходит, моя функция медленнее а я-то думал с умным видом сказать "вот это - метод бисекции" -------------------- qqq |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |