java - 编写函数 : short GetBits(short data, int p, int n)

标签 java bit-masks

我正在编写一个函数short getBits(short data, int p, int n)

我已经尝试过:

public static short getBits(short data, int p, int n) {
    short bitmask = (short) ((~0 << (16 -n)) >>> p);
    short returnVal = (short) ((bitmask & data) >>> (16 - n));
    return returnVal;
}

这适用于 getBits( (short) 0x7000, 0, 4),但如果我用 8 替换 7,我会得到一个负值。

最佳答案

要使 Java 数据类型发挥作用,需要记住一些事情。

我假设您使用 int 变量,因为表达式中没有显式转换。如果您使用 int 类型作为变量:数据 start_pos 和长度;您应该使用 32 而不是 16,因为 int 是 32 位值。

此外,如果您要使用 int、short 或 byte 等整数基元类型,请记住这些基元类型是符号扩展的二进制补码,这意味着如果您对像 ~0 这样的负数进行右移 (计算结果为 -1),则将在高位(符号位)上附加 1,而不是零。

例如:

1111 1111 1111 1111 1111 1111 1111 1000        
>>1
1111 1111 1111 1111 1111 1111 1111 1100 

现在回到你的问题。总体思路是能够做到:

data & mask

现在,对于有符号数据类型生成掩码有点棘手。使用以下方法生成掩码是有意义的:

(~0 << (32 - length) >> (32 - length - start_pos))

但是由于符号扩展,这当然行不通。

我建议不要使用右移>>,而是使用旋转运算符>>>,这样旋转运算符将附加低位,而不是附加在高位上。

例如:

1111 1111 1111 1111 1111 1111 1111 1000        
>>>1
0111 1111 1111 1111 1111 1111 1111 1100 

所以...

mask = (~0 << 32-length >>> 32-length-start_pos)

你的最终答案将类似于:

(data & (~0 << 32-length >>> 32-length-start_pos)) >>> start_pos

最外面的旋转操作将屏蔽数据移动到低位。

关于java - 编写函数 : short GetBits(short data, int p, int n),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1061528/

相关文章:

mysql/位掩码 : select for NOT value

java - java中的抽象类错误

sql - 导轨 : A database-independent datatype that's suitable for bitwise operations

ios - 在 iOS 中使用位掩码发送和接收数据

algorithm - 如何在 O(2^n) 内存和 O(2^n *n) 时间中检查哈密顿行走是否存在

成员为 'ObjectSetType' 的 Swift 协议(protocol)

java - 顺序搜索算法

java - 什么时候使用 TreeSet 比 HashSet 更快?

java - 当我将某些类变量重新分配给新对象时会发生什么?

java - 将 Jersey 项目转换为标准 Servlet 应用程序的起点