如果最高有效字节的最高有效位为 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,则样本为负的主要内容,如果未能解决你的问题,请参考以下文章

原码补码反码

Linux 网络编程字节序和地址装换

大端序和小端序,最高有效位和最低有效位

字节序

朴素贝叶斯python小样本实例

数在计算机中的表示