将二进制链接列表转换为它的等效十进制数

时间:2016-09-15 20:00:11

标签: c data-structures linked-list

我想将二进制链表(每个节点包含一个位)转换为十进制等效值。例如:

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?谁能告诉我这行功能并显示它有效吗?

2 个答案:

答案 0 :(得分:1)

res << 1res的位模式转换为“左”(更高位数)。

由于整数使用二进制表示法存储在内存中,因此向左移位会使数字加倍 - 与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)

直观地思考 - 在每次循环迭代中,你将所有位推到左边,打开一个新的插槽。然后,加法运算符正在填充右侧的那个插槽。