Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对C+中ptrdiff#t的使用感到困惑+;_Java_C++_Porting - Fatal编程技术网

Java 对C+中ptrdiff#t的使用感到困惑+;

Java 对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

我需要用Java翻译这行代码,我 不确定如何处理ptrdiff\t。不知道它在这里做什么。顺便说一下,遮罩块 类型为大小\u t

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
的所有非零值,它是
1
ptrdiff\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保证两个补码整数,甚至没有无符号整数。所以它应该可以正常工作。

是的。或者更确切地说,使用您在目标程序中翻译的任何东西的签名版本。@RamyAlZuhouri
ptrdiff\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