|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
28.05.2013, 16:56 | #1 |
Регистрация: 28.05.2013
Сообщений: 7
|
Xor байта с qword
Здравствуйте! С утра думаю над проблемой... Голова уже болеть начала Так ничего годного и не придумал.
Имеется: переменная A (8 байт), переменная B (1 байт), параметр X; Цель: поксорить 8 бит переменной A с переменной B, начиная с произвольного бита, заданного в X; Средства: пишу на PureBasic, требуется подсказать логику, а не код. Возможны инлайн-вставки асма, но т.к. переменная 8 байт, а пишу я под x86, не думаю, что асм чем-то поможет. Хотя, может, я и не прав; Попытки решения: а) A ! ((B << 56)>> X) ; попытка поксорить со сдвинутым значением B. Вроде всё хорошо, до тех пор, пока число не будет начинаться с 1. работает: 00110110 сдвиг влево: 00110110000000000000000000000000000 00000000000000000000000000000 сдвиг на позицию (скажем, x = 10): 00000000000011011000000000000000000 00000000000000000000000000000 косяк: 10110110 сдвиг влево: 10110110000000000000000000000000000 00000000000000000000000000000 сдвиг на позицию (скажем, x = 10): 11111111111011011000000000000000000 00000000000000000000000000000 B объявлена, как беззнаковое слово, если это имеет значение. б) попытка создать маску вида [X нулей][еденицы] для AND'а c результатом, полученным выше, но могу получить только [нули][X едениц]... Переводить NEG'атив [нули][X едениц] в строку для инвертирования (ReplaceString), затем перевода назад в число, затем OR'ить с [нули][X едениц], для последующего AND'а со сдвинутой B, для последующего XOR'а с A считаю нерациональным, думаю, любой уважающий себя программист со мной согласится Наверняка есть решение проще. Последний раз редактировалось Dartes; 28.05.2013 в 16:59. |
28.05.2013, 17:02 | #2 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
Это вообще как-то не укладывается в голове с понятием сдвига битов.
I'm learning to live...
|
|
28.05.2013, 17:06 | #3 |
Регистрация: 28.05.2013
Сообщений: 7
|
Ну вот... Я ещё пробовал вместо сдвига вправо использовать деление на степень двойки, ну по сути это вроде одинаково работает (сдвиг вправо на 3 бита аналогично делению на 2^3)... Результат был тот же, только реализовано страшнее. |
28.05.2013, 17:18 | #4 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
28.05.2013, 17:22 | #5 |
Регистрация: 28.05.2013
Сообщений: 7
|
Аватар, спасибо большое! Сам не нагуглил ((( В голову не стукнуло, что косяк в самом пурике...
...только, как я и говорил, у меня число большое, и как модифицировать асмовский код для процедуры не знаю... Код:
Последний раз редактировалось Dartes; 28.05.2013 в 17:49. |
28.05.2013, 18:11 | #6 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
А можно еще наверное так:
Если первый бит - 1 то инвертировать. Потом сдвигать и инвертировать обратно. Хотя конечно косяк этот никак не на пользу Бейсику.
I'm learning to live...
|
28.05.2013, 18:27 | #7 | |
Регистрация: 28.05.2013
Сообщений: 7
|
Stilet
Цитата:
Последний раз редактировалось Dartes; 28.05.2013 в 18:45. |
|
28.05.2013, 19:57 | #8 |
Регистрация: 28.05.2013
Сообщений: 7
|
Всем спасибо за участие, всё гениальное - просто
Код:
Последний раз редактировалось Dartes; 28.05.2013 в 20:43. |
29.05.2013, 20:01 | #9 |
Пользователь
Регистрация: 15.08.2012
Сообщений: 23
|
|
08.06.2013, 09:09 | #10 |
Регистрация: 28.05.2013
Сообщений: 7
|
Это не очевидно в данном случае, потому что число как раз беззнаковое, а раз я сдвигаю беззнаковое число, то почему я получаю знаковый результат? Это, всё же, косяк Я же не виноват, что пурик поддерживает только знаковые длинные числа.
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
шифрование байта | Oleg1988 | Общие вопросы C/C++ | 7 | 31.08.2012 19:41 |
объеденить 2 байта | NEoMASTERR | Общие вопросы Delphi | 1 | 01.05.2012 12:33 |
Инвертирование байта (string vs asm vs xor) | bizkitlimp | Общие вопросы Delphi | 4 | 08.01.2012 23:12 |
Чтение 0 байта | TorrMoZZZZ | Помощь студентам | 0 | 26.09.2010 21:44 |