gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:22:26 26 4
gpt4 key购买 nike

我想将每个节点包含单个位的二进制链表转换为十进制等效值。示例:

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 的?谁能告诉我这条线的功能并表明它正在工作?

最佳答案

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;
...

关于将二进制链表转换为等效的十进制数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39519411/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com