c - 我可以使用“MAX”宏来检查是否所有位都已设置?
问题描述
我最近接受了一次采访,我不得不提出一个函数来检查 uint32_t 中的所有位是否都已设置。
我写了以下代码:
int checkStatus(uint32_t val) {
return val == UINT32_MAX;
}
我假设如果未设置一位,它将返回 0,如果两个值相同,则返回 1。
由于我在其他任何地方都没有看到此解决方案,因此我认为它是错误的。但我不明白为什么。当我这样做时,我在想:“如果所有位都设置为 1,那么该值应该是表示的最大无符号整数,否则不会。” 你能告诉我它是否不正确,为什么?
解决方案
在这里使用的问题UINT32_MAX
是“最大值”是一个算术概念,而不是按位逻辑概念。尽管UINT32_MAX
实际上在大多数情况下都表示(无符号)数字 0xFFFFFFFF,但这只是数字以二进制补码算法表示的方式的结果。
在这里使用UINT32_MAX
可能会误导读者,因为它具有算术的含义,而不是按位操作的含义。
在 C 编程中,我们都习惯将位模式表示为十六进制数字。数字“0xFFFFFFFF”立即表达了所有位都已设置的概念,但UNIT32_MAX
实际上并没有。类似地,在算术表达式中使用值“0xFFFFFFFF”来表示“减 1”可能不合适,即使这些值在实践中是相同的。
因为我大部分时间都在寻找其他人的代码中的错误,所以我敏锐地意识到表达同一事物的不同方式在表达能力上的差异。有时我们因为效率低下而不得不写一些没有表现力的东西;但我认为我们不应该仅仅为了它而这样做。
推荐阅读
- android - 如何更新与 Android Studio 一起使用的 annotations-13.0.jar?
- r - 将基本图转换为 grob,保持纵横比
- apache-spark - Spark 中的 java.io.NotSerializableException
- node.js - 向 slackbot 发送私人消息,而工作区的其他用户不会看到它
- reactjs - 使用来自 CMS 的语法高亮呈现代码
- php - 如果输出中的值相同,则将它们合并在一起
- c++ - 将 --whole-archive 链接器选项与 CMake 和具有其他库依赖项的库一起使用
- spring-boot - 从 CassandraOperations 检索 DataStax 会话
- typescript - 打字稿条件类型:推理有效,但编译器拒绝实现
- .htaccess - .htacess 将目录重定向到一个域,将子目录重定向到不同域