【问题标题】:How to compute expressions like ~0x000C by hand?如何手动计算像 ~0x000C 这样的表达式?
【发布时间】:2017-05-05 16:10:27
【问题描述】:

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

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

【问题讨论】:

  • IDE 没有执行这些操作。不管怎样,你听说过数字的二进制表示吗?
  • 我明白数字是如何用二进制表示的。
  • 您需要了解数字的十六进制、二进制和十进制表示以及如何在它们之间进行转换。
  • 然后手动转换成二进制,执行操作再转换回你想要的任何东西。完成。
  • 是的。除非你有足够的经验来跳过中间步骤。

标签: c bit-manipulation bit


【解决方案1】:

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

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

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

unsigned short x = 0x000C = 0b0000 0000 0000 1100

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

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

请注意,当您开始尝试使用将诸如整数之类的本机类型抽象为“无限大数”的语言(例如 Python 和 VBScript)来执行此类操作时,此类操作会变得很棘手。翻转 16 位 unsigned short 的位与翻转“无限大数”的位有很大不同,而且更有可能。

【讨论】:

  • @PeroWhatshisnamović 绝对!很高兴有帮助。请记住,ALU 处理的是数字的二进制表示。所有其他表示都是我们的编程语言的抽象,以使我们的生活更轻松……一旦编译并组装成机器代码,它就是二进制的。因此,以二进制形式考虑所有这些按位运算及其操作数会有所帮助。
  • @Treebasher - 使用 BCD 表示的机器除外 :-)
  • @pm100 真相。以及网络协议等。上帝帮助他们:P。但即使在最低级别,BCD 表示仍然只是位......您只需要知道如何缩放和屏蔽它们。
  • 请注意,0b 不是标准的 C 前缀,尽管它在 C++14 及更高版本中,因此许多 C 编译器都支持它作为扩展。
猜你喜欢
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 2017-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多