matlab 16位灰度值转8位,将16位值转换为8位值的有效方法

虽然两个答案都是正确的,但这里的位屏蔽是完全冗余的.它转换为uint8_t时会隐式发生.如果没有确切大小的整数类型(并且,考虑到性能,您应该考虑这一点,因为在使用机器的本机字大小时性能通常最佳),这将是不同的:

unsigned int val = 0xabcd;

unsigned int vr = val & 0xff;

assert(vr == 0xcd);

但是当你真的需要这些确切大小的类型时,最好的代码是恕我直言

uint16_t val = 0xabcd;

uint8_t vr = (uint8_t) val;

明确的演员在这里记录意图!没有它,一个好的编译器会警告你隐式转换可能会丢失信息(你应该总是启用编译器警告,例如gcc -Wall -Wextra -pedantic,以捕获你意外进行这种转换的情况).

使用精确大小的类型的所有变体的性能应该是相同的,因为一个体面的编译器将为所有变体发出相同的代码.使用unsigned int的版本可能会更好一点.

[编辑]:正如您所询问的内存性能一样:使用uint8_t不太可能获得某些东西,因为某些体系结构需要将小于本机字大小的值与字边界对齐.如果他们不需要它,那么将它们对齐可能仍然会更快,因此编译器可能会决定这样做.这只是引入了未使用的填充字节.使用gcc,您可以使用选项-Os来优化大小,并且由于x86架构是字节可寻址的,这可能导致uint8_t在PC上没有填充的情况下使用,但因此速度较低.大多数情况下,速度与内存是一种权衡,你可以有一个或另一个.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值