c - 如何手动计算像 ~0x000C 这样的表达式?

标签 c bit-manipulation bit

我是电气工程专业的学生。在我们的编程课上,我们得到了一堆 C 语言练习,并被要求解释会发生什么以及您的 IDE 如何执行位操作。

因此,例如,如果我得到 unsigned short x = 0x000C 并执行 ~x,输出为 65523。您的 IDE 如何执行此操作?

最佳答案

为了提供一些上下文,一般来说,我们使用以下前缀来表示数字的不同基本表示形式:

  • 没有前缀表示以 10 为底,也就是十进制(我们在日常生活中使用的)
  • 0x 表示 base-16,又名十六进制(从 0-9A-F 计数,因此单个数字可以表示 0 到 15 之间的任何值...这需要四位,因为数字 15有 0b1111)
  • 的十进制表示
  • 0b 表示 base-2,也就是二进制(从 0-1 计数...每个数字需要 1 位)
  • 0 表示 base-8,也就是八进制(从 0-7 计数...每个数字需要 3 位)

因此,考虑到这一点,您可能已经知道但其他用户可能不知道,这就是幕后以非常高层次的方式发生的事情。假设 unsigned short 在您的环境中是 16 位宽,并且给定...

无符号短 x = 0x000C = 0b0000 0000 0000 1100

...a ~ 是按位否定运算符,这意味着您只需翻转所有位。所以,例如:

~0b0000 0000 0000 1100 = 0b1111 1111 1111 0011 = 0xFFF3 = 65523

请注意,当您开始尝试使用将整数等 native 类型抽象为“无限大数”的语言(如 Python 和 VBScript)时,此类事情会变得棘手。翻转 16 位无符号短整型的位与翻转“无限大数”的位有很大不同,而且可能性更大。

关于c - 如何手动计算像 ~0x000C 这样的表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43809461/

相关文章:

c - 为什么 free() 需要动态数组的起始指针?

c - 将字符存储在数组中,C

我可以在 "... "之前传递数组类型吗?在哪里可以找到 va_* 的宏代码

c++ - 在哪里了解 “bit”?

Java 位解包器与 C 不匹配

c - 段错误,在 C 中初始化递归结构

c++ - 数字 xor K - K = 数字 + K xor K,为什么?

c++ - 按位读取缓冲区

swift - Swift 中的 &<< 和 << 运算符有什么区别?

bit - 逆向工程,左移七位