问题标签 [saturation-arithmetic]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
18 回答
37945 浏览

c - 如何在C中进行无符号饱和加法?

在 C 中编写饱和加法的最佳(最干净、最有效)的方法是什么?

如果总和溢出,函数或宏应添加两个无符号输入(需要 16 位和 32 位版本)并返回全位为一(0xFFFF 或 0xFFFFFFFF)。

目标是使用 gcc (4.1.2) 和 Visual Studio 的 x86 和 ARM(仅用于模拟,因此可以使用后备实现)。

0 投票
2 回答
8939 浏览

c - C(HW)中的按位饱和加法

我正在处理一项任务,但我不知道如何实现它。我必须创建一个函数sadd(int x, int y)来返回加在一起的数字,除非它溢出(然后只返回最大可能的 int)。我已经能够提出一些涉及强制转换和条件语句的解决方案,但解决方案中不允许使用这些解决方案。只有运算符~ ! ^ + << >> &|

0 投票
1 回答
267 浏览

assembly - 使用 MMX 汇编指令的乘法加左移操作

我正在寻找做shl(mult(var1,var2),1)运算,其中mult乘法var1var2(都是 16 位有符号整数)并shl在算术上左移乘法结果。结果必须是饱和的,即 int32 max 或 int32 min 如果发生上溢或下溢并且mult(-32768,-32768)=2147483647

我需要以我认为使用 MMX/SSE 指令集的有效方式对多个值进行此操作。我虽然关于制作mult(sign_extesion(var1)shl(sign_extension(var2)))但我刚刚发现不mult()存在 MMX 饱和版本。你知道有什么其他方法可以得到吗?

0 投票
2 回答
2425 浏览

assembly - 添加饱和的 32 位字

您知道使用 MMX/SSE 汇编指令添加饱和 32 位有符号字的任何方法吗?我可以找到 8/16 位版本,但没有 32 位版本。

0 投票
4 回答
3181 浏览

c - Signed saturated add of 64-bit ints?

I'm looking for some C code for signed saturated 64-bit addition that compiles to efficient x86-64 code with the gcc optimizer. Portable code would be ideal, although an asm solution could be used if necessary.

The function as written produces a fairly lengthy assembly output with several branches. Any tips on optimization? Seems like it ought to be be implementable with just an ADD with a few CMOV instructions but I'm a little bit rusty with this stuff.

0 投票
14 回答
19940 浏览

java - How can I increment a variable without exceeding a maximum value?

I am working on a simple video game program for school and I have created a method where the player gets 15 health points if that method is called. I have to keep the health at a max of 100 and with my limited programming ability at this point I am doing something like this.

I understand my syntax about isn't perfect but my question is, what may be a better way to do it, because I also have to do a similar thing with the damage points and not go below 0.

This is called saturation arithmetic.

0 投票
2 回答
6457 浏览

c - C - 用位运算符饱和有符号整数乘法

好的,所以我要做的就是将有符号整数乘以 2 并返回值。如果值溢出,则通过返回 Tmin 或 Tmax 来使其饱和。挑战在于仅使用这些逻辑运算符(!~ & ^ | + << >>)而不使用(if 语句、循环等),并且最多只允许 20 个逻辑运算符。

现在我解决这个问题的思考过程是首先找到极限。所以我将 Tmin/max 除以 2 以获得边界。这是我所拥有的:

积极的

这个和更高的作品:

这个和更低的不会:

如果它不起作用,我需要返回这个:

消极的

这和更低的作品:

这个和更高的不会:

如果它不起作用,我需要返回这个:

否则我必须返回:

(顺便说一下,整数是 32 位的)

我看到前两位对于确定问题是否应该返回 2*x 或限制很重要。例如,异或会做,因为如果第一个到位相同,则应返回 2*x,否则应返回限制。然后需要另一个 if 语句来处理整数的符号,因为它是负数 Tmin 需要返回,否则 Tmax 需要返回。

现在我的问题是,如何在不使用 if 语句的情况下做到这一点?xD 或者一个更好的问题是我计划这个工作的方式,甚至在限制条件下可行?或者更好的问题是是否有更简单的方法来解决这个问题,如果有,如何解决?任何帮助将不胜感激!

0 投票
3 回答
1867 浏览

x86 - 添加饱和 32 位有符号整数内在函数?

有人可以推荐一种使用英特尔内在函数(AVX、SSE4 ...)添加饱和 32 位有符号整数的快速方法吗?

我查看了内在函数指南,发现_mm256_adds_epi16但这似乎只添加了 16 位整数。对于 32 位,我没有看到任何类似的东西。其他电话似乎环绕。

0 投票
11 回答
13742 浏览

c++ - 饱和减法/加法无符号字节

想象一下我有两个无符号字节bx. 我需要计算bsubasb - xbaddas b + x。但是,我不希望在这些操作期间发生下溢/溢出。例如(伪代码):

显而易见的方法包括分支:

我只是想知道是否有更好的方法来做到这一点,即通过一些 hacky 位操作?

0 投票
1 回答
299 浏览

assembly - 有没有办法在 x86 上使用 MMX/SSE 减去压缩的无符号双字?

我一直在看 MMX/SSE,我想知道。有用于无符号字节和字的压缩饱和减法的指令,但不是双字。

有没有办法做我想做的事,或者如果没有,为什么没有?