Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2013, 16:56   #1
Dartes
 
Регистрация: 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.
Dartes вне форума Ответить с цитированием
Старый 28.05.2013, 17:02   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
косяк:
Нифига себе косяк!
Это вообще как-то не укладывается в голове с понятием сдвига битов.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.05.2013, 17:06   #3
Dartes
 
Регистрация: 28.05.2013
Сообщений: 7
По умолчанию


Ну вот... Я ещё пробовал вместо сдвига вправо использовать деление на степень двойки, ну по сути это вроде одинаково работает (сдвиг вправо на 3 бита аналогично делению на 2^3)... Результат был тот же, только реализовано страшнее.
Dartes вне форума Ответить с цитированием
Старый 28.05.2013, 17:18   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

http://minilabmaster.com/cgi-bin/yab...num=1323098821
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.05.2013, 17:22   #5
Dartes
 
Регистрация: 28.05.2013
Сообщений: 7
По умолчанию

Аватар, спасибо большое! Сам не нагуглил ((( В голову не стукнуло, что косяк в самом пурике...
...только, как я и говорил, у меня число большое, и как модифицировать асмовский код для процедуры не знаю...

Код:
Procedure Shr2(num,count)
  a.l = num / $100000000
  b.l = num % $100000000
  temp.l = 0
  !MOV dword EAX, [p.v_a]
  !MOV dword EDX, [p.v_b]
  !MOV byte CL, [p.v_count]
  !SHRD EAX, EDX, CL
  !MOV dword [p.v_num], 0
  !MOV dword [p.v_num], EAX
  !MOV dword [p.v_temp], EDX
  num = num * $100000000
  num = num + temp
  ProcedureReturn num
EndProcedure

B.q = %10110110
Debug Bin(B)
B = B << 56
Debug Bin(Shr2(B,10))
даёт 0 веселимся с инлайн асмом дальше...

Последний раз редактировалось Dartes; 28.05.2013 в 17:49.
Dartes вне форума Ответить с цитированием
Старый 28.05.2013, 18:11   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А можно еще наверное так:
Если первый бит - 1 то инвертировать. Потом сдвигать и инвертировать обратно.
Хотя конечно косяк этот никак не на пользу Бейсику.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.05.2013, 18:27   #7
Dartes
 
Регистрация: 28.05.2013
Сообщений: 7
По умолчанию

Stilet
Цитата:
B = ~B
B = (B << 56) >> x
B = ~B
A = A ! B
Всё круто, но те биты, что должны бы быть нолями, теперь еденички ))) ибо по центру остаётся полезный байт, каким был, а остальные при сдвиге обнулялись, и при повторном инвертировании становятся 1...

Последний раз редактировалось Dartes; 28.05.2013 в 18:45.
Dartes вне форума Ответить с цитированием
Старый 28.05.2013, 19:57   #8
Dartes
 
Регистрация: 28.05.2013
Сообщений: 7
По умолчанию

Всем спасибо за участие, всё гениальное - просто
Код:
    If (56-x)>0
      scrn(y+lol) = scrn(y+lol) ! (string << (56-x))
    Else
      scrn(y+lol) = scrn(y+lol) ! (string >> (56-x))
    EndIf
жаль, не я додумался долго тупил

Последний раз редактировалось Dartes; 28.05.2013 в 20:43.
Dartes вне форума Ответить с цитированием
Старый 29.05.2013, 20:01   #9
pbt
Пользователь
 
Регистрация: 15.08.2012
Сообщений: 23
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Хотя конечно косяк этот никак не на пользу Бейсику.
Это не косяк.
Происходит потому что число знаковое, а сдвиг арифметический, а не логический. В справке об этом написано.
pbt вне форума Ответить с цитированием
Старый 08.06.2013, 09:09   #10
Dartes
 
Регистрация: 28.05.2013
Сообщений: 7
По умолчанию

Цитата:
Сообщение от pbt Посмотреть сообщение
Это не косяк.
Происходит потому что число знаковое, а сдвиг арифметический, а не логический. В справке об этом написано.
Это не очевидно в данном случае, потому что число как раз беззнаковое, а раз я сдвигаю беззнаковое число, то почему я получаю знаковый результат? Это, всё же, косяк Я же не виноват, что пурик поддерживает только знаковые длинные числа.
Dartes вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
шифрование байта 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