我想将二进制链表(每个节点包含一个位)转换为十进制等效值。例如:
Input : 0->0->0->1->1->0->0->1->0
Output : 50
我在网上找到了一个解决这个问题的代码,但是我很难理解某个特定的行。
/* Returns decimal value of binary linked list */
int decimalValue(struct Node *head)
{
// Initialized result
int res = 0;
// Traverse linked list
while (head != NULL)
{
// Multiply result by 2 and add
// head's data
res = (res << 1) + head->data;
// Move next
head = head->next;
}
return res;
}
我无法理解此代码中re = (res << 1) + head->data
的用法。我的意思是如何在这一行中乘以2?谁能告诉我这行功能并显示它有效吗?
答案 0 :(得分:1)
res << 1
将res
的位模式转换为“左”(更高位数)。
由于整数使用二进制表示法存储在内存中,因此向左移位会使数字加倍 - 与res * 2
相同。
MSbit LSbit
v v
0000 1111 0011 0011 or 3891
shifted left
0001 1110 0110 0110 or 7782
当没有溢出或涉及负数时, res << 1
就像res * 2
一样。
出于OP的目的,以下内容相同。
res = (res << 1) + head->data;
res = (res * 2) + head->data;
在任何一种情况下,健壮的代码都会注意溢出。
if (res > INT_MAX/2) { puts("Overflow"); exit(-1) }
res = (res * 2) + head->data;
...
答案 1 :(得分:0)
直观地思考 - 在每次循环迭代中,你将所有位推到左边,打开一个新的插槽。然后,加法运算符正在填充右侧的那个插槽。