gpt4 book ai didi

java - 在java中模拟具有两个最大幂的无符号数

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:50:26 24 4
gpt4 key购买 nike

我有一些来自 (C++) 应用程序的输出,该应用程序以一种在 233 处回绕为零的类型存储一个 tickcount 值。 (8,589,934,592) (没有密码)

我需要以同样的方式编写自己的输出。我通过 JNA 从 C 库中检索了滴答计数,但是如果我将它存储在一个 int 中,它会在约 25 天的滴答计数后包装到 -231 (-2,147,483,648) 并且如果我将它存储在一个 long它一直超过 233

如何在 Java 中存储(或写入)值,使其在 233 处回绕(归零)?

(最好是 JRE7- & JRE8- on Win32- & Win64- & Linux-compatible solution)

要获取滴答计数,我使用以下命令:

import com.sun.jna.*;
public interface Kernel32 extends Library {
Kernel32 INSTANCE = (Kernel32) Native.loadLibrary((Platform.isWindows() ? "kernel32" : "c"), Kernel32.class);

/**
* Retrieves the number of milliseconds that have elapsed since the system was started.
*
* @return number of milliseconds that have elapsed since the system was started.
* @see http://msdn2.microsoft.com/en-us/library/ms724408.aspx
*/
Long GetTickCount();
}

public interface Clib extends Library {
Clib INSTANCE = (Clib) Native.loadLibrary((Platform.isWindows() ? "kernel32" : "c"), Clib.class);

/**
* Retrieves the number of milliseconds that have elapsed since the system was started.
*
* @return number of milliseconds that have elapsed since the system was started.
*/
Long clock();
}

// And later
Number n = (Platform.isWindows() ? Kernel32.INSTANCE.GetTickCount() : Clib.INSTANCE.clock()).toString());

最佳答案

您可以将值存储在 long 中,然后通过执行以下操作将值截断为 33 位(将 233 环绕为 0):

n &= (1L << 33) - 1;

这与以下内容完全相同:

n &= 0x1_ffff_ffffL;

也等同于:

n &= 8_589_934_591L;

关于java - 在java中模拟具有两个最大幂的无符号数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31862481/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com