相关疑难解决方法(0)

如何在C中进行饱和添加?

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

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

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

c algorithm performance signal-processing saturation-arithmetic

40
推荐指数
7
解决办法
3万
查看次数

C(HW)中的逐位饱和加法

我正在完成一项任务,我无法弄清楚如何实现这一点.我必须创建一个函数sadd(int x,int y),它返回添加在一起的数字,除非它溢出(然后只返回max possible int).我已经能够提出一些涉及强制转换和条件语句的解决方案,但解决方案中不允许这些解决方案.只有经营者〜!^ + << >>&和|.

c bit-manipulation addition saturation-arithmetic

7
推荐指数
1
解决办法
6319
查看次数

C 中 6 次运算中的带符号饱和乘以 2?

有符号 2 的补码 32 位整数的问题:

\n
\n

satMul2- 乘以 2,饱和TminTmax溢出。
\n示例: satMul2(0x30000000) = 0x60000000
\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 satMul2(0x40000000) = 0x7FFFFFFF(饱和到TMax)
\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 satMul2(0x60000000) = 0x80000000(饱和到TMin)
\n合法操作:! ~ & ^ | + << >>
\n最大操作:20
\n评级:3

\n
\n

我想实现一个类似的功能

\n
if (a) return b;\nelse return c;\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的解决方案(10 次操作):

\n
int satMul2(int x) {\n    int rval = x << 1;\n    int sign = rval ^ x;\n    int minn = 1 << 31;\n …
Run Code Online (Sandbox Code Playgroud)

c bit-manipulation bitwise-operators micro-optimization saturation-arithmetic

6
推荐指数
1
解决办法
571
查看次数

如何证明C语句-x,~x + 1和〜(x-1)产生相同的结果?

我想知道这个陈述背后的逻辑,证据.对于任何x,C表达式-x,~x + 1和〜(x-1)都产生相同的结果.我可以证明这对于具体的例子是正确的.我认为证明这一点的方法与两个补码的属性有关.有任何想法吗?

c proof twos-complement

4
推荐指数
2
解决办法
996
查看次数

x86_64 - 汇编 - 循环条件和乱序

不是要求基准.

(如果是这样的话,我会自己做的.)


我的问题:

为方便起见,我倾向于避免间接/索引寻址模式.

作为替代,我经常使用立即,绝对或寄存器寻址.

代码:

; %esi has the array address. Say we iterate a doubleword (4bytes) array.
; %ecx is the array elements count
(0x98767) myloop:
    ... ;do whatever with %esi
    add $4, %esi
    dec %ecx
    jnz 0x98767;
Run Code Online (Sandbox Code Playgroud)

在这里,我们有一个序列化的组合(dec和jnz),它可以防止正常的乱序执行(依赖).

有没有办法避免/破坏dep?(我不是装配专家).

assembly loops x86-64 conditional-statements

4
推荐指数
1
解决办法
1070
查看次数