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