【发布时间】:2011-04-07 20:36:58
【问题描述】:
让我们有一个任务是在 C++ 中对变量 a 进行左按位旋转而不进位。我认为,使用内联汇编来执行这个例程会更好,不是吗?
例如,如果我们有a == 100 == 0b<a bunch of zeros>1100100,a LR 1 应该提供0b1001001 == 73(即不是0b11001000 == 200)。
那么,问题是:应该如何重写下面的代码以适应上面的任务?
#include <stdio.h>
int main()
{
long long a = 0;
scanf("%ld", &a);
// Here the left-shifting should be replaced with left-rotating
printf("%ld\n", a << 1);
return 0;
}
【问题讨论】:
-
这几乎肯定不会更好。
a << 1将映射到您可以编写的完全相同的程序集(或者,至少,等效程序集 - 例如寄存器可能不同)。 -
您想转移到哪里?您的样本显示只是很长。如果这就是您的意思,a
-
我认为现有的班次是无效的?
-
抱歉,忘了说一个小因素 =)
-
@shybovycha:我认为您误解了进位在 ASM 级别的工作原理。它通常来自 MSb(位 31 或 63),或来自 lsb(位 0)
标签: c gcc bitwise-operators inline-assembly