我试图理解以下代码的每一行,但我的知识阻止我 取得成功。
这实际上是一段取自java教程的代码,涉及绘制音频信号(波形)
简而言之,代码的作用基本上是: 如果音频数据样本大小等于 16 并且编码类型为 BigEndian 则执行此操作... 嗯..问题是我希望能够理解每一个代码语句的含义.. 谁能帮我 ? 提前谢谢了... 原始代码在这里: http://www.koders.com/java/fid3508156A13C80A263E7CE65C4C9D6F5D8651AF5D.aspx?s=%22David+Anderson%22 (采样图类)
我想理解的代码如下:
if (format.getSampleSizeInBits() == 16) {
int nlengthInSamples = audioBytes.size() / 2;
audioData = new int[nlengthInSamples];
if (format.isBigEndian()) {
for (int i = 0; i < nlengthInSamples; i++) {
/* First byte is MSB (high order) */
int MSB = (int) audioBytes.get(2 * i);
/* Second byte is LSB (low order) */
int LSB = (int) audioBytes.get(2 * i + 1);
audioData[i] = MSB << 8 | (255 & LSB);
}
特别是您如何将以下代码翻译成文字:
audioData[i] = MSB << 8 | (255 & LSB);
...再次感谢 垫子
最佳答案
这就是所谓的 bitwise operation ;它在位级别操作数字。
-
<<
是按位左移运算符 ( JLS 15.19 Shift Operators ) -
|
和&
分别是按位“或”和“与”( JLS 15.22.1 Integer Bitwise Operators &, ^, and | )
该片段结合了 2 byte
将 16 位样本写入 int
在big endian格式。
255,二进制为11111111
(即 8 个 1 的序列),用于“屏蔽”较低的 byte
,撤消任何 sign extension (byte
在 Java 中是有符号数字类型)。通常使用十六进制表示 0xFF
而不是此类运算中的十进制 255。
如果您不想因位级操作而陷入困境,应该有一些库可以以可靠的方式为您完成此操作。
相关问题
关于java - 音频信号绘图代码解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3184802/