tеstеr
Сообщений: 377
Оценки: -46
Присоединился: 2008-02-08 17:56:40.563333
|
Первое что приходит на ум примитивный метод выделения битов со сдвигами: 1. Наложить на число маску, выделяющую нужный бит. 2. Сдвинуть этот нужный бит в 0-ю позицию. Вот как решается твоя задача на c++, на ассемблере заменяешь >> на сдвиг вправо. << меняешь на сдвиг влево, или же вообще делаешь просто, используешь константы: 1 << 0 = 0000 0001 1 << 1 = 0000 0010 1 << 2 = 0000 0100 1 << 3 = 0000 1000 1 << 4 = 0001 0000 и так далее. Понадобится 3 регистра (3 регистра по 1 байту), что физически уложится в 2 регистра. Т.е. всё просто. #include <QtCore/QCoreApplication>
int main(int argc, char *argv[])
{
//Пусть это наше значение
unsigned int value = 123;
//Пример - как самым примитивным образом можно разложить значение по битам
unsigned int x0, x1, x2, x3, x4, x5, x6, x7;
x0 = (value & (1 << 0)) >> 0;
x1 = (value & (1 << 1)) >> 1;
x2 = (value & (1 << 2)) >> 2;
x3 = (value & (1 << 3)) >> 3;
x4 = (value & (1 << 4)) >> 4;
x5 = (value & (1 << 5)) >> 5;
x6 = (value & (1 << 6)) >> 6;
x7 = (value & (1 << 7)) >> 7;
printf("%d%d%d%d %d%d%d%d\n",x7,x6,x5,x4,x3,x2,x1,x0);
//Используя вышеуказанный способ разложения выполняем задачу
//f=(x7 & x6 & x3 ) V (x6 & x4 & x2 & x1) V (x7 & x6 & x2 & x0)
unsigned int f; //результат вычислений
unsigned int f_temp; //переменная для хранения промежуточных результатов
f_temp = (value & (1 << 7)) >> 7;
f_temp = f_temp & (value & (1 << 6)) >> 6;
f_temp = f_temp & (value & (1 << 3)) >> 3;
f = f_temp;
f_temp = (value & (1 << 6)) >> 6;
f_temp = f_temp & (value & (1 << 4)) >> 4;
f_temp = f_temp & (value & (1 << 2)) >> 2;
f_temp = f_temp & (value & (1 << 1)) >> 1;
f = f | f_temp;
f_temp = (value & (1 << 7)) >> 7;
f_temp = f_temp & (value & (1 << 6)) >> 6;
f_temp = f_temp & (value & (1 << 2)) >> 2;
f_temp = f_temp & (value & (1 << 0)) >> 0;
f = f | f_temp;
printf("f = %d\n",f);
return f;
}
|