问题标签 [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.
c - 如何在C中进行无符号饱和加法?
在 C 中编写饱和加法的最佳(最干净、最有效)的方法是什么?
如果总和溢出,函数或宏应添加两个无符号输入(需要 16 位和 32 位版本)并返回全位为一(0xFFFF 或 0xFFFFFFFF)。
目标是使用 gcc (4.1.2) 和 Visual Studio 的 x86 和 ARM(仅用于模拟,因此可以使用后备实现)。
c - C(HW)中的按位饱和加法
我正在处理一项任务,但我不知道如何实现它。我必须创建一个函数sadd(int x, int y)
来返回加在一起的数字,除非它溢出(然后只返回最大可能的 int)。我已经能够提出一些涉及强制转换和条件语句的解决方案,但解决方案中不允许使用这些解决方案。只有运算符~ ! ^ + << >> &
和|
。
assembly - 使用 MMX 汇编指令的乘法加左移操作
我正在寻找做shl(mult(var1,var2),1)
运算,其中mult
乘法var1
和var2
(都是 16 位有符号整数)并shl
在算术上左移乘法结果。结果必须是饱和的,即 int32 max 或 int32 min 如果发生上溢或下溢并且mult(-32768,-32768)=2147483647
。
我需要以我认为使用 MMX/SSE 指令集的有效方式对多个值进行此操作。我虽然关于制作mult(sign_extesion(var1)
,shl(sign_extension(var2)))
但我刚刚发现不mult()
存在 MMX 饱和版本。你知道有什么其他方法可以得到吗?
assembly - 添加饱和的 32 位字
您知道使用 MMX/SSE 汇编指令添加饱和 32 位有符号字的任何方法吗?我可以找到 8/16 位版本,但没有 32 位版本。
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.
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.
c - C - 用位运算符饱和有符号整数乘法
好的,所以我要做的就是将有符号整数乘以 2 并返回值。如果值溢出,则通过返回 Tmin 或 Tmax 来使其饱和。挑战在于仅使用这些逻辑运算符(!~ & ^ | + << >>)而不使用(if 语句、循环等),并且最多只允许 20 个逻辑运算符。
现在我解决这个问题的思考过程是首先找到极限。所以我将 Tmin/max 除以 2 以获得边界。这是我所拥有的:
积极的
这个和更高的作品:
这个和更低的不会:
如果它不起作用,我需要返回这个:
消极的
这和更低的作品:
这个和更高的不会:
如果它不起作用,我需要返回这个:
否则我必须返回:
(顺便说一下,整数是 32 位的)
我看到前两位对于确定问题是否应该返回 2*x 或限制很重要。例如,异或会做,因为如果第一个到位相同,则应返回 2*x,否则应返回限制。然后需要另一个 if 语句来处理整数的符号,因为它是负数 Tmin 需要返回,否则 Tmax 需要返回。
现在我的问题是,如何在不使用 if 语句的情况下做到这一点?xD 或者一个更好的问题是我计划这个工作的方式,甚至在限制条件下可行?或者更好的问题是是否有更简单的方法来解决这个问题,如果有,如何解决?任何帮助将不胜感激!
x86 - 添加饱和 32 位有符号整数内在函数?
有人可以推荐一种使用英特尔内在函数(AVX、SSE4 ...)添加饱和 32 位有符号整数的快速方法吗?
我查看了内在函数指南,发现_mm256_adds_epi16
但这似乎只添加了 16 位整数。对于 32 位,我没有看到任何类似的东西。其他电话似乎环绕。
c++ - 饱和减法/加法无符号字节
想象一下我有两个无符号字节b
和x
. 我需要计算bsub
asb - x
和badd
as b + x
。但是,我不希望在这些操作期间发生下溢/溢出。例如(伪代码):
和
显而易见的方法包括分支:
我只是想知道是否有更好的方法来做到这一点,即通过一些 hacky 位操作?
assembly - 有没有办法在 x86 上使用 MMX/SSE 减去压缩的无符号双字?
我一直在看 MMX/SSE,我想知道。有用于无符号字节和字的压缩饱和减法的指令,但不是双字。
有没有办法做我想做的事,或者如果没有,为什么没有?