这个c片段做了什么?

时间:2012-03-30 21:42:23

标签: c algorithm

// input, output, i, and k are uint16_t type
// It is assured that k is non-negative and "small enough"
// k = 4
// input = 0x3a44
output = 0;
for (i=k; i<16; i++){
if (input & 1<<i)
output = output | 1 <<(i-k);
}

所以输入= 0011 1010 0100 0100 当k = 4或0000 0000 0000 0100时,循环运行12次

我想令我困惑的是if和输出部分是如何工作的,我知道按位运算符&amp;和|左移是&lt;&lt; ..但我迷失了循环的整体功能

4 个答案:

答案 0 :(得分:2)

如果i中的input位置位,则输出中的i-k位将被设置,i范围为k通过取output | (1 << n)并将output位设置为1,n的值为1 << n,因为n是一个只有一位的整数,即位置{{1}}中的一个,设置为1。

答案 1 :(得分:2)

显然是为了使输出等于(16位)输入,右移4位(或者分配给K的值恰好是)。

答案 2 :(得分:0)

这是向右的逻辑移位k位。不确定为什么output = input >> k;没有被使用,但我不是C专家

答案 3 :(得分:0)

当试图理解这样的密集代码时,尝试在纸上写出一个值表,并手动计算循环中的每个项目。

或者,如果您对Excel感到满意,请将其构建为电子表格。每次迭代循环可以有一行,如果需要,该行可以引用前一行(因为你必须使用变量output)。通过展开循环并显示中间值(如(1<<i)1<<(i-k)),您可以更好地了解正在发生的事情。