Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.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与内置clz的等价物是什么?_Java_C - Fatal编程技术网

Java与内置clz的等价物是什么?

Java与内置clz的等价物是什么?,java,c,Java,C,我需要一个相当于Java的\uuuuu builtin\uCLZ 感觉答案应该是长的。numberofleadingzero但它们返回的答案完全不同 我开始怀疑这是否有一个低级的原因——也许是endianness?或者是一些未签名的怪癖 编辑:假警报。这纯粹是由于键入错误造成的-原始代码实际上调用了\uuuuu builtin\u ctzll,并与Long匹配。numberoftrailingzeroLong。numberofleadingzero完全正确 事实上,你会得到不同的答案,因为C.C

我需要一个相当于Java的
\uuuuu builtin\uCLZ

感觉答案应该是
长的。numberofleadingzero
但它们返回的答案完全不同

我开始怀疑这是否有一个低级的原因——也许是endianness?或者是一些未签名的怪癖


编辑:假警报。这纯粹是由于键入错误造成的-原始代码实际上调用了
\uuuuu builtin\u ctzll
,并与
Long匹配。numberoftrailingzero
Long。numberofleadingzero
完全正确

事实上,你会得到不同的答案,因为C.C没有定义
int
的含义。因此,
\uuu builtin\u clz(a)
给出的答案在您运行它的每个框上都是不同的:它取决于
int
的位宽度,并且根据C标准,
int
的位宽度对于您编译的系统来说是方便的。如果它是32位的(这是一个非常常见的位宽度),
\uuu builtin\uclz(16)
将返回27。如果它是64位的(也很常见),
内置clz(16)
将返回59

Java通常不会“做”所有未定义的事情。在java中,与C不同,
int
是一个有符号的32位数字。无论您在哪个虚拟机、版本、平台或操作系统上运行或编译它。类似地,long是有符号的64位

然而,
Long.numberOfLeadingZeroes
有效地将数字视为无符号的,就像
\uuuuuUiltin\uCLZ
那样:这意味着
\uUiltin\uCLZ(x)
,其中x是负数,总是返回0(或者根据C规范,应该返回0),numberOfLeadingZeros的作用完全相同:对于负数,始终返回0(无前导零位)


换句话说,在64位系统上,
内置clz(x)
与java中的
长.numberofleadingzero(x)
完美匹配。在32位系统上,
\uuuuuu-builtin\u-clz(x)
返回的值小于32位(
\uuuuuu-builtin\u-clz(16)
在64位上是59,但在32位上是27),在java中,必须使用
Integer.numberOfLeadingZeros()
<代码>整数。NumberOfLeadingZero(16)返回27。就像
\uuuu builtin\u clz(16)
一样,如果目标系统
int
定义为32位(如果目标是32位处理器,则可能是)。

错误警报:由输入错误引起-我实际上需要
\uuu builtin\u ctzll
,这现在更有意义了。

\uuu builtin clz()
统计非零
int
值中前导零的数量。此数字取决于类型
int
的表示,因此在java中没有直接等效,因为C标准整数类型(如
int
long
long
中的位数是实现定义的,而java规范固定了类型
int
long
的大小和表示形式

除了
\uuuuuuuiltin\uclz(int)
,gcc定义了
\uuuuuiltin\uclzl(long)
\uuuuuiltin\uclzl(long)
。在大多数当前系统上,C ABI将
int
定义为32位,将
long
定义为64位,使
成为整数.numberOfLeadingZeros(int)
long.numberOfLeadingZeros(long)
分别相当于
\uuuuuuuuuuuuuuu-clz
\uuuuuuuu-clzll
。但是请注意,java函数定义了C内置函数没有的零参数的行为,这是作为单个CPU指令实现的结果(在某些体系结构上)

\uuuuu-builtin\u-ctz(int)
\uuuuu-builtin\u-ctzl(long)
\uuuuuuu-builtin\u-ctzl(long-long)
计算相应类型的非零参数中尾随零的数量。对于非零值,尾随零的数量仅取决于参数的值,而不是其类型大小。相应的java方法是
Integer.numberOfTrailingZeros(int)
Long.numberOfTrailingZeros(Long)
。这些方法是为所有参数值定义的,并分别为零参数返回
32
64

换句话说,在64位系统上,
\uuuuu内置clz(x)
Long.numberofleadingzero(x)
完全匹配。。。不完全正确:
\u内置clz
将匹配
长。在
int
有64位的系统上,零的前导数
,这是非常不寻常的,因为在大多数64位系统上
int
仍然有32位。相反,
\uuuuuu内置clzll
通常与
Long.numberofleadingzero
匹配。