首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么__builtin_parity是相反的?

为什么__builtin_parity是相反的?
EN

Stack Overflow用户
提问于 2021-10-16 17:35:12
回答 1查看 779关注 0票数 4

GCC和Clang都支持一个名为__builtin_parity的实现定义函数,该函数帮助确定一个数字的奇偶性。

根据GCC说什么?

内置函数: int __builtin_parity (无符号int x) 等高线返回x的奇偶,即x模2中的1位数.

这意味着,如果1位数是偶数,它将返回0和1如果奇数。

我在编译器资源管理器上测试的Clang也是如此。

但是,当设置位数为偶数时,则设置实际的奇偶校验标志

为什么会这样呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-16 17:55:55

他们只是不同的任意性选择。

首先要注意的是,“实际奇偶校验标志”是只在某些体系结构上提供的硬件特性;在目前主流使用的体系结构中,我认为x86是唯一具有这种标志的。因此,这种旗帜的存在,更不用说确切的语义,在任何方面都不是一个普遍的标准。

我认为GCC的选择更符合逻辑:0和1分别对应于偶数和奇数,因为0是偶数,1是奇数。我不知道为什么x86和它的前身选择做相反的事情。你可能得回到过去问问设计师。

无论如何,8086奇偶标志的实际值并不是很重要;程序员通常会使用JPEJPO汇编程序助记符来测试它,这只允许您指定“跳转如果奇偶”或“跳转如果奇数”,而不必记住哪一个对应于标志中的0或1位。只有当您希望通过PUSHFLAHF实际检查标志注册中的位时,该值才会变得相关,这仅在非常模糊的情况下才有用。

我看了一下历史。英特尔8086从8080中复制了它的标志,而8080也是如此。它的前身,8008,也有一个奇偶“触发器”,它似乎是设定在偶数平等,但这有点不清楚,因为你只能有条件地跳转的状态,翻转-触发器,而不是实际阅读。据说8008是从Datapoint 2200派生出来的,它实际上记录了它的奇偶翻转:设置为奇数,重置为偶数。但是,80xx语义可能是一些内部实现细节,没有任何深层次的意义,比如奇偶校验电路恰好产生了这样的结果,而且他们也没有费心地添加另一个非门来反转它。任何进一步的调查可能更多关于Retrocomputing.SE的话题。

无论如何,x86奇偶校验标志对于GCC的__builtin_parity()来说只是一点用处,因为它只测试一个字节。如果没有其他选项,则可以通过xor‘s将其字节放在一起,并使用GCC/clang会这么做来实现更大的值。它通过使用setnp而不是setp来处理标志的反向含义(人类程序员只需要编写setpo,而不必考虑标志的set/clear值)。

然而,过去10年中几乎所有的x86 CPU都支持popcnt指令和GCC/clang将在可用的情况下使用这个 (然后只提取低位)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69598048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档