我需要用Java翻译这行代码 不知道如何处理ptrdiff_t。不知道它在这里做了什么。顺便说一句,mask_block 是size_t类型。
size_t lowest_bit = mask_block & (-(ptrdiff_t)mask_block);
由于
答案 0 :(得分:5)
小心!这有点神奇!
( x & ~(x-1) )
返回表达式中的最低设置位。原始代码的作者决定使用( x & (-x) )
,由于整数的two's comlement表示,它实际上是相同的。但是(原作者认为)要获得-x
,您需要使用签名类型,并且如前所述,ptrdiff_t
已签名,size_t
未签名。
由于Java没有未签名类型,mask_block
将为int
而mask_block & (-mask_block)
可以正常运行。
请注意,由于有符号和无符号类型之间的互操作性,在C ++中,强制转换也是多余的。
答案 1 :(得分:4)
ptrdiff_t
是应该用于两个指针之间(整数)差异的类型。也就是说,从另一个指针中减去一个指针的结果。它是一个有符号整数,应该足够大,可以大小最大可能的数组(所以在Java中,这只是一个int
,我猜)
答案 2 :(得分:1)
x & -x
有点破解,清除x
除最低位之外的所有位。
对于x
的所有非零值,它是1 << lb
,其中lb
是最低有效位的位置(从0开始计数)。
为什么要投放到ptrdiff_t
?没有进一步的了解,很难说。我甚至不确定演员是否需要。 ptrdiff_t
保证是有符号整数类型,size_t
始终是无符号整数类型。所以,我想C ++代码的作者想要确保它是有符号的,并且与指针的大小相同。只需忽略转换就可以将代码移植到Java,就像在Java中所有整数都被签名一样。
生成的代码也比原始的C / C ++版本更具可移植性,原始的C / C ++版本假设机器使用2's complement来表示整数,尽管它(至少在理论上)不受C或C ++的保证。标准。但是,在Java中,保证JVM必须使用2的补码。