如果最高有效字节的最高有效位为 1,则样本为负
Posted
技术标签:
【中文标题】如果最高有效字节的最高有效位为 1,则样本为负【英文标题】:if the most-significant bit of most-significant byte is 1, then sample is negative 【发布时间】:2020-09-30 04:20:16 【问题描述】:您好,我正在做一个音频处理项目
代码运行良好,但我不明白这三行
如果有人知道这些代码行的内容
// Otherwise, if the most-significant bit of most-significant byte is 1, then
// sample is negative, so we need to set the upper bytes to all 1s.
else if (sampleBytes[bytesPerSample-1] & 0x80)
for (size_t b = bytesPerSample; b < sizeof(sample); b++)
sampleBytes[b] = 0xFF;
【问题讨论】:
具体有什么不明白的?sampleBytes
的类型是什么?您是否在询问如何用二进制表示负数(例如二进制补码)?或者您是在询问使用按位与的实际测试?
副手,这个 sn-p 似乎是将音频样本作为原始字节处理的较大代码的一部分,并且可能处于将样本放大到更大字节大小的逻辑中间,例如从每个样本 2 个字节到 4 个字节,在这种情况下,是对负样本进行符号扩展,以将它们的数值保留在新的大小中。
【参考方案1】:
这些行将带有 'bytesPerSample' 字节放在 'sampleBytes' 中的数字扩展到与 'sample' 变量一样多的字节,如果它是负数,则用 1 完成。
在大多数系统中,负数以二进制形式表示为两个补码形式 (https://en.wikipedia.org/wiki/Two%27s_complement)。也就是说,-x = NOT(x) + 1。
For example:
11111111 = 1
11111110 = 2
11111101 = 3
11111100 = 4
...
因此,如果数字为负数,则必须与要扩展的数字一起完成以保持该值。
第一行断言数字是否为负数,第二行通过额外的字节进行迭代,最后一行以十六进制表示。
【讨论】:
以上是关于如果最高有效字节的最高有效位为 1,则样本为负的主要内容,如果未能解决你的问题,请参考以下文章