饱和指令使未签名的符号无符号或签名为signed int。
将带符号的16位整数饱和到无符号字节的最佳方法是什么?
简而言之,这就是逻辑
uint8_t usat8(uint8_t u8, int16_t s16)
{
s16 += u8;
if(s16 <= 0) {
return 0;
} else if(s16 >=255){
return 255;
}else{
return (uint8_t)s16;
}
}
void add_row(uint8_t * dst, uint8_t * u8, int16_t * s16)
{
for(int i=0; i<XXX; ++i)
{
dst[i] = usat8(u8[i] + s16[i]);
}
}
s16的值通常与[0,255]范围相差无几,例如可以安全地假设abs(s16 [x])&lt; 1000。
编辑:我刚刚意识到USAT16实际上将带符号的16位int饱和为无符号整数。简单的USAT16是解决问题的方法。
答案 0 :(得分:0)
经过5分钟的思考,我有了这个想法(伪arm-asm):
sadd16 sum, s16, u8 @ do two additions in parallel
orr signs, 0x1001, sum, lsr #15 @ extract signs of the two 16 bit results
usat16 sum, sum, #8 @ saturate both of the 16-bit sums to unsigned 8-byte range
uadd16 sum, sum, signs
这样,如果为任何总和设置了符号位,则结果总和将变为256或0x100。当写回数据时,移出的0x1将被丢弃。
任何评论,这似乎是最佳方法,还有更好的选择吗?
PS。我是为armv6设备做的,没有NEON或armv6t2