gpt4 book ai didi

C 编程 - 按位运算符并了解何时使用

转载 作者:行者123 更新时间:2023-12-03 04:04:22 27 4
gpt4 key购买 nike

我在《K&R II C 编程 ANSI C》一书中读到,“>>”和“<<”运算符控制位,当然,由于我是菜鸟,我不明白何时使用它们。我对弄清楚如何手动构建数据包很感兴趣,并且发现了以下代码片段:

unsigned short csum(unsigned short *buf, int nwords)
{
unsigned long sum;
for(sum=0; nwords>0; nwords--)
sum += *buf++;
sum = (sum >> 16) + (sum &0xffff);
sum += (sum >> 16);
return (unsigned short)(~sum);
}

我知道这会计算校验和,但我不明白这里发生了什么。 XD

显然这超出了我的技能范围,但我想我可以使用这个片段作为替罪羊来找出一些未解答的问题。 何时您知道何时使用按位运算符来获得某个值,为什么不直接加 (+) 或减 (-) 呢?另外,如果没有运算符,为什么 sum 旁边有一个十六进制 &0xffff

附注~sum 是什么意思?

最佳答案

这不是一个问题,而是一大堆问题。 :)

  1. 当您想要将数字视为位的集合而不是整数时,可以使用按位运算符。说“我希望这个位模式向左移动两位”比创建数学上等效的运算要容易得多。它们在概念上是不同的;如果您将数字视为位,那么使用位运算符更有意义。
  2. & 0xffff 通过屏蔽所有高位来确保该值是 16 位。这假设系统的 unsigned long 至少有 16 位宽,这是一个非常安全的假设。 &(按位AND)通常用于此目的。看truth table对于逻辑连接并思考“假为 0,真为 1”,看看它是如何工作的。
  3. 十六进制常量之前的 & 是 C 的按位 AND 运算符,用于执行我上面描述的屏​​蔽。基本上,对于单位变量 a & b,当且仅当 ab 时,结果为 1 > 是 1。运算符将此逻辑应用于其输入项中的每对位。
  4. ~ 运算符是 C 的按位反转,它“翻转”其参数的位。它通常用于创建蒙版。

关于C 编程 - 按位运算符并了解何时使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10899881/

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