Реализация сдвига битов на 32-битном значении с использованием 16-битного - PullRequest
1 голос
/ 20 декабря 2010

Я работаю на языке, который может выполнять двоичную математику только для 16-битных чисел, но мне нужно использовать двоичную математику для 32-битных значений, поэтому я должен сделать некоторые из своих собственных функций.Например, я реализовал двоичное ИЛИ как:

 _32bit_or(a,b){
  var{
   a1=round(a/(2**16));
   a2=a%(2**16);
   b1=round(b/(2**16));
   b2=b%(2**16);
  }
  .=((a1|b1) * (2**16)) + (a2|b2);
 }

Разделить 32-битное значение на две 16-битные части, ИЛИ каждую часть, и рекомбинировать.Достаточно просто.

Но теперь мне нужно реализовать сдвиг, который не так прост, потому что, разбивая числа на части, сдвигая и затем объединяя, я теряю биты!Я попробовал:

 _32bit_rshift(a,b){
  var{
   a1=round(a/(2**16));
   a2=a%(2**16);
  }
  . = ((a1>>b) * (2**16)) + (a2>>b)
 }

Но это, конечно, не работает, как я уже говорил.Кто-нибудь может предоставить какой-нибудь вклад?

1 Ответ

1 голос
/ 20 декабря 2010

Для левого сдвига 1 сдвиньте верхнее слово И нижнее слово с 0x8000 и ИЛИ верхний результат с 1, если результат И не равен 0, затем сдвиньте нижнее слово.

Длясдвиг вправо 1, сдвиг нижнего слова, И верхнего слова с 1 и ИЛИ нижнего результата с 0x8000, если результат И не равен 0, затем сдвиньте верхнее слово.

Смещение более чем на одинбит требует больших значений для И с и соответствующего сдвига перед ИЛИ.

...