//сумматор
int Summ(int a, int b)
{
int t;
do
{
t = a & b; //получаем поразрядные биты переносов
a ^= b; //получаем поразрядные биты полусумм
b = t << 1;//сдвигаем биты переносов влево на их потенциальное место
}
//продолжаем пока есть хоть один бит переноса
while (t != 0);
return a;
}
//двоичная инверсия
int BinNegate(int a)
{
return a ^ -1;
}
//арифметическая инверсия
int MathNegate(int a)
{
return Summ(BinNegate(a), 1);
}
他们给你有趣的谜题。我不会给出一个完整的解决方案,它不是运动型的,但我会向你展示这个想法和一些空白。它基于这样一个事实,即 XOR 运算的结果等同于半加器的结果,并且只需要正确考虑进位位即可。当然,在硬件层面,一切都更简单地在全加器的串行链上实现,所以这只是对这种电路操作的模仿。
进一步已经自己。二进制除法很简单,算法很简单,但在极端情况下,你可以通过一个减法循环来解决,但使用提供的工具从加法中进行减法是很简单的。二进制比较是减去和检查符号位。不幸的是,没有与零操作的比较是不可能的,处理器为此在标志寄存器中使用一个特殊的标志,它是在执行算术运算期间设置的,而 C# 不支持“所有不是零是真的”条件运算符的约定,但是,例如,在 C/C++ 中,此约定是受支持的,您可以在不与零比较的情况下进行操作。很明显,这个问题只追求学术兴趣,