【发布时间】:2015-05-29 17:19:48
【问题描述】:
我有以下 C 代码(来自 FFMPEG):
static inline av_const int sign_extend(int val, unsigned bits)
{
unsigned shift = 8 * sizeof(int) - bits;
union { unsigned u; int s; } v = { (unsigned) val << shift };
return v.s >> shift;
}
我正在尝试在 JAVA 中重现这一点。但我很难理解这一点。不管我怎么折腾,我都不是很接近。
至于value参数:它将无符号字节值作为int。
位参数:4
如果值为 255 且位为 4,则返回 -1。我无法在 JAVA 中重现它。抱歉这么模糊的问题。但是你能帮我理解这段代码吗?
总体情况是,我正在尝试用 JAVA 对 EA ADPCM 音频进行编码。在 FFMPEG 中: https://gitorious.org/ffmpeg/ffmpeg/source/c60caa5769b89ab7dc4aa41a21f87d5ee177bd30:libavcodec/adpcm.c#L981
【问题讨论】:
-
不太熟悉Java,但是Java有two different right-shift operators:有符号(
>>)和无符号(>>>)。在 C 中,区别在于移位者的类型。在您的 Java 代码中,您需要>>>。 -
我尝试了 >>>,但显然我不明白代码到底在做什么。 (255 >>> 4) 在 JAVA 中的结果是 15,而不是 C 函数返回的 -1。
-
C 代码不适用于 BYTES,它正在使用 INTEGERS。在现代硬件中,整数要么是 32 位(或者最近是 64 位)
-
'av_const' 修饰符有什么作用?