// 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; ..但我迷失了循环的整体功能
答案 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)
),您可以更好地了解正在发生的事情。