Java从很长的范围内获取位范围

标签 java binary logical-operators bitmask

我需要从一个 long 值中提取某些位范围,例如:

long input = 15367 (11110000000111)

然后我需要做的是从原来的long中提取出两个long值,

First long is 5 bits starting from bit 0, so bits 0:4 = 7 (0111)
Second long is 56 bits starting from bit 8, so bits 7:55 = 60 (1111000)

我知道这可以通过移位和屏蔽来完成,但是我不完全确定如何实现它,所以它每次都是动态的,因为每次我需要这样做时,long 都会不同,等等将特定的位范围。

我一直在阅读有关 BitSets 和 BitArrays 的内容,但我不完全确定这些是否适合这项工作。

我们将不胜感激任何关于实现这一点的最佳方式的建议。

谢谢!

最佳答案

提取nrBits从偏移量 offset 开始的位,你可以这样做:

public static long extractSub(final long l, final int nrBits, final int offset)
{
    final long rightShifted = l >>> offset;
    final long mask = (1L << nrBits) - 1L;
    return rightShifted & mask;
}

注意 >>> 的用户右移运算符;这样您就不会随身携带符号位。

至于(1L << nrBits) - 1L , 即 2^nrBits - 1 . L是有long常量。

另请注意,没有“边界检查”(例如,偏移量或位数大于 63 或负数)。

关于Java从很长的范围内获取位范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18082982/

相关文章:

java - 如何注入(inject)单例?

c++ - 给定很长的二进制,将其转换为十进制

python - 在python中循环一个二进制数

c - C 中包含递增的逻辑表达式的求值

javascript - 初始化变量时,Bash 相当于 Ruby 和 JavaScript OR

java - 通过泛型避免向下转型?

java - 可以从java获取客户端mac地址吗?

java - 使用字符索引 HashMap 时出现 NullPointerException

c++ - 字符串到二进制文件

c++ - 使用逻辑运算符评估条件的多个If语句与单个语句