【问题标题】:What is the best way to calculate number of padding bytes计算填充字节数的最佳方法是什么
【发布时间】:2019-08-09 16:57:30
【问题描述】:

在 C 中计算需要是 32 位倍数的 8 位数据的填充量的最有效方法是什么?

目前我是这样做的:

pad = (4-size%4)%4;

【问题讨论】:

  • 对于 2 的幂,您可以使用 & 而不是 %: pad= (4 - ( 0x3 & size )) & 0x3 ;
  • @woolstar 编译器会生成完全相同的代码,我相信。只是你的可读性较差。
  • -size&3 应该是一样的。
  • @JoachimIsaksson 对负数的按位运算是 UB、IIRC
  • @JanDvorak:定义了对整数的按位运算,无论是否为负。 bitwise 结果是完全定义的; 数学结果取决于表示形式,对于有符号整数,表示形式受 C 2011 6.2.6.2 2 的约束,可以是符号和幅度、二进制补码或一个补码之一,可能带有填充位。一般来说,这会产生一个陷阱值,但&3 操作尤其不能产生一个陷阱值,因为它清除了高位。

标签: c bit-manipulation padding


【解决方案1】:

只要优化编译器对% 4 使用位掩码而不是除法,我认为您的代码可能相当不错。这可能是一个小小的改进:

// only the last 2 bits (hence & 3) matter
pad = (4 - (size & 3)) & 3;

但同样,优化编译器可能足够聪明,无论如何都可以将您的代码减少到这个程度。我想不出更好的了。

【讨论】:

  • 我一直盯着问题和答案看了一段时间,但我不明白为什么外部的“& 3”是必要的。帮助?编辑:没关系,我看到了。当 "size & 3 == 0" 时它是必要的,因为我们宁愿填充 0 而不是填充 4。
【解决方案2】:
// align n bytes on size boundary
pad n size = (~n + 1) & (size - 1)

这类似于 TypeIA 的解决方案,仅使用机器语言操作。

(~n + 1) computes the negative value, that would make up 0 when added to n
& (size - 1) filters only the last relevant bits.

例子

pad 13 8 = 3
pad 11 4 = 1

【讨论】:

    【解决方案3】:

    pad = (-size)&3;

    这应该是最快的。

    size 0: pad 0
    size 1: pad 3
    size 2: pad 2
    size 3: pad 1
    

    【讨论】:

    • 虽然如果size 是有符号类型,它假定二进制补码,但最好将size 明确转换为size_t
    猜你喜欢
    • 2015-12-18
    • 2010-11-26
    • 2021-05-20
    • 1970-01-01
    • 2012-08-30
    • 2014-08-29
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    相关资源
    最近更新 更多