小编Min*_*int的帖子

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
查看次数