Я работаю на языке, который может выполнять двоичную математику только для 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)
}
Но это, конечно, не работает, как я уже говорил.Кто-нибудь может предоставить какой-нибудь вклад?