当前位置: 首页 > 知识库问答 >
问题:

无符号整数的快速无分支最大值

令狐功
2023-03-14

我从聚合魔法中找到了一个快速计算最大值的技巧。唯一的问题是整数,尽管我做了一些尝试,但我不知道如何为无符号整数创建一个版本。

inline int32_t max(int32_t a, int32_t b)
{ 
    return a - ((a-b) & (a-b)>>31);
}

有什么建议吗?

编辑

不要使用它,因为正如其他人所说,它会产生未定义的行为。对于任何现代体系结构,编译器都能够从返回(a)发出无分支条件移动指令

共有1个答案

蔚琦
2023-03-14

这段代码是做什么的?它取a的值和差a-b。当然,a-(a-b)b。和(a-b)

如果减法溢出,则此代码不正确。然而,这与无符号整数的情况相同。因此,如果您满足于这样一个事实,即您的代码在整个值范围内都不正确,那么您可以简单地忽略无符号,并使用以下方法:

inline uint32_t umax(uint32_t a, uint32_t b) {
    return (uint32_t)max((int32_t)a, (int32_t)b);
}

 类似资料:
  • 我有一个程序,它花费大部分时间计算RGB值之间的欧几里德距离(无符号8位Word8的3元组)。我需要一个快速、无分支的无符号int绝对差分函数,这样 特别是, unsigned_differencea b==unsigned_differenceb a 使用GHC 7.8中的新primops,我得出了以下结论: ghc-O2-S编译为 使用编译会产生以下asm: 所以LLVM设法用(更有效?)条件

  • 全新的汇编需要一些无符号算术方面的帮助。从C程序转换是什么意思。 使用: Linux操作系统 美国国家科学院 x86(32位) 我想从用户那里读入一个数字。我希望这个号码没有签名。当我输入一个超过有符号整数限制的数字并使用信息寄存器时,我注意到我的寄存器存储的是负数,这意味着发生了溢出。(显然输入的数字低于max unsigned int)如何将此寄存器视为无符号,以便根据结果进行比较和跳转?

  • 我正在简单的C程序中试验无符号int数据类型和主方法参数。作为一个实验,我写了一个程序,从命令行获取一个int数作为main方法的参数,并对该数和0之间的每个整数求和。 例如,程序计算 f(n) = (1 2 3... n) 当 n 时有效 我开始注意到的第一件事是当f(n) 我手动发现数学上的最大值,我的程序生成的结果将是有效的(例如,在整数溢出之前),对于有符号整数为65535,对于无符号in

  • 我正在读一篇关于整数安全性的文章。以下是链接:http://ptgmedia.pearsoncmg.com/images/0321335724/samplechapter/seacord_ch05.pdf 在第166页,有这样一句话: 涉及无符号操作数的计算永远不会过流,因为不能由结果无符号整数类型表示的结果将被模化为比结果类型可以表示的最大值大一的数字。 这是什么意思?感谢您的回复。

  • 上个小节我们主要学习了 Go 语言中的整型 int 数据类型,本小节主要介绍了 Go 语言中处理无符号的整数的数据类型。 1. 定长类型 序号 类型 长度 1 uint8 0~255 2 uint16 0~65535 3 uint32 0~4294967295 4 uint64 0~18446744073709551615 2. 不定长类型 在 Go 语言中也实现了随着平台位数变化而变化的数据类型

  • 我正在接收 无符号到整数的隐式转换 使用以下代码: 但是当我将方法的 路由到< code > Admin::questions controller 的< code>create方法,为什么它不起作用?我是rails和命名空间的新手,所以我可能忽略了一些显而易见的东西。 编辑: 问题控制器的命名空间在admin下。