Java 对C+中ptrdiff#t的使用感到困惑+;
我需要用Java翻译这行代码,我 不确定如何处理ptrdiff\t。不知道它在这里做什么。顺便说一下,遮罩块 类型为大小\u tJava 对C+中ptrdiff#t的使用感到困惑+;,java,c++,porting,Java,C++,Porting,我需要用Java翻译这行代码,我 不确定如何处理ptrdiff\t。不知道它在这里做什么。顺便说一下,遮罩块 类型为大小\u t size_t lowest_bit = mask_block & (-(ptrdiff_t)mask_block); 谢谢ptrdiff\u t是应该用于两个指针之间(整数)差的类型。也就是说,从一个指针减去另一个指针的结果。它是一个有符号整数,应该足够大,可以选择最大可能数组的大小(所以在Java中,我猜这只是一个int)小心!这有点神奇 (x&~(x-1
size_t lowest_bit = mask_block & (-(ptrdiff_t)mask_block);
谢谢
ptrdiff\u t
是应该用于两个指针之间(整数)差的类型。也就是说,从一个指针减去另一个指针的结果。它是一个有符号整数,应该足够大,可以选择最大可能数组的大小(所以在Java中,我猜这只是一个int
)小心!这有点神奇
(x&~(x-1))
返回表达式中的最低设置位。原始代码的作者决定使用(x&(-x))
,由于整数的表示,这实际上是相同的。但是(原作者认为)要获得-x
,需要使用有符号的类型,正如前面指出的,ptrdiff\u t
是有符号的,size\u t
是无符号的
由于Java没有无符号类型,mask\u block
将是int
,mask\u block&(-mask\u block)
将正常工作
注意,由于符号和无符号类型之间的互操作性,C++中的CAST也是多余的。
<代码> X-&X-/COD>是一个有点的清除了<代码> x<代码>的所有位,排除其最低位。对于
x
的所有非零值,它是1ptrdiff\u t
是类型的名称,如int
或::std::string
。C++标准承诺,这种类型将是一个整数类型,足以容纳任何两个指针之间的差异。当然,减法指针在Java中是一个相当陌生的概念。为了能够做到这一点,ptrdiff\u t
必须能够容纳负数
使用ptrdiff\u t
的子表达式是一个强制转换表达式,类似于Java类型转换。但是,与java类型转换不同,C++的CAST表达式更危险更丑陋。它们可以用于Java不愿意进行的各种不同类型的转换。有时它们会产生令人惊讶的结果
在本例中,似乎有人需要一个某种类型的无符号整数(可能是无符号long
或其他类型)才能为负值。他们需要将其转换为有符号值ptrdiff_t
通常是平台支持的最大整数。因此,如果要将任意无符号整数类型转换为有符号整数类型,ptrdiff\u t
将是最不可能使用C++相当丑陋的强制转换操作导致某种奇数截断或符号更改的类型
特别是,他们想要的类型是 SsieZiT<<代码>,这是C++标准中的另一种类型。它是一个无符号类型(就像我猜的那样),并且保证是一个整数类型,它的大小足以容纳内存中任何可能对象的大小。它的大小通常与ptrdiff\u t
相同
编写代码的人想要这样做的原因是一个有趣的位操作技巧。为了向您展示技巧,我将向您展示这个表达式在许多场景中的表现
假设mask_block
为48。假设在这个假设的平台上,size\u t
是16位(这非常小,但这只是一个示例)。在二进制中,mask_block
如下所示:
0000 0000 0011 0000
1111 1111 1101 0000
0000 0000 0011 0010
1111 1111 1100 1110
0000 0000 0000 0010
而-(ptrdiff_t)mask_block
为-48,如下所示:
0000 0000 0011 0000
1111 1111 1101 0000
0000 0000 0011 0010
1111 1111 1100 1110
0000 0000 0000 0010
所以,48&-48
是这样的:
0000 0000 0001 0000
这是16。请注意,这是48中最低设置位的值。让我们试试50英镑。50看起来像这样:
0000 0000 0011 0000
1111 1111 1101 0000
0000 0000 0011 0010
1111 1111 1100 1110
0000 0000 0000 0010
和-50看起来像这样:
0000 0000 0011 0000
1111 1111 1101 0000
0000 0000 0011 0010
1111 1111 1100 1110
0000 0000 0000 0010
所以,50&-50
看起来像这样:
0000 0000 0011 0000
1111 1111 1101 0000
0000 0000 0011 0010
1111 1111 1100 1110
0000 0000 0000 0010
这是2。请再次注意,这是50中最低设置位的值
因此,这只是在掩码中查找最低设置位的值的一个技巧。变量被称为最低位的事实应该是一个线索。:-)
当然,这个技巧不是完全可移植的。C和(现在可能是C++)运行的一些平台不使用两个补充表示,并且这个技巧在那些平台上不起作用。
在Java中,您可以这样做long lower\u bit=mask\u block&-mask\u block代码>并获得相同的效果。Java保证两个补码整数,甚至没有无符号整数。所以它应该可以正常工作。是的。或者更确切地说,使用您在目标程序中翻译的任何东西的签名版本。@RamyAlZuhouriptrdiff\u t
是一种固定类型,不会根据您拥有的指针类型而变化。这完全取决于计算机的寻址空间有多大(换句话说,通常是32或64位)。我不确定你们说的话是否与我的问题有关:(不,ptrdiff\u t
是一种类型,所以(ptrdiff\u t)
将表达式的类型(在本例中为mask\u block
)更改为ptrdiff\u t。就像在Java!中一样,-
会使结果为负值。无论如何,如果您想知道整行的功能,那么问一个特别提到ptrdiff\u t
的问题会有点误导。这导致要得到像我这样的答案,它告诉你ptrdiff\u t
的目的是什么,因为这就是你所问的,而不是解释整行的功能(这显然是你想知道的?),一般来说,如果你真的问了你想要回答的问题,你会得到更好的答案最低位是最低有效位还是最高有效位?@AdamStelmaszczyk除最低有效位外,所有位都已清除。因此,我们能否只制作掩码块&1
?@AdamStelmaszczyk不,最低有效位不为零。因此,结果是mask\u bloc