Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.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 检索存储在int的某些位中的值_Java - Fatal编程技术网

Java 检索存储在int的某些位中的值

Java 检索存储在int的某些位中的值,java,Java,我们划分了一个int以将三个值保存到其中。例如,前8位(从左到右)保存一个值,第8到12位保存另一个值,其余位保存第三个值 我正在写一个实用方法,从int的某个特定范围的位中获取值。它足够好吗?你有更好的解决办法吗开始位和结束位从右向左计数。 public static int bitsValue(int intNum, int startBitPos, int endBitPos) { //parameters checking ignored for now

我们划分了一个int以将三个值保存到其中。例如,前8位(从左到右)保存一个值,第8到12位保存另一个值,其余位保存第三个值

我正在写一个实用方法,从int的某个特定范围的位中获取值。它足够好吗?你有更好的解决办法吗开始位和结束位从右向左计数。

public static int bitsValue(int intNum, int startBitPos, int endBitPos) 
{           
   //parameters checking ignored for now        
    int tempValue = intNum << endBitPos;
    return tempValue >> (startBitPos + endBitPos); 
}
公共静态int位值(int-intNum、int-startBitPos、int-endBitPos)
{           
//参数检查暂时被忽略
int tempValue=intNum>(开始位+结束位);
}
编辑:


我确信所有的值都将是无符号的。

不,目前这不太正确:

  • 应该使用无符号右移运算符,以避免在不需要负数时以负数结束。(当然,这是假设原始值是无符号的。)
  • 你没有适当地向左移动以清除多余的高位
我怀疑你想要:

// Clear unnecessary high bits
int tempValue = intNum << (31 - endBitPos);
// Shift back to the lowest bits
return tempValue >>> (31 - endBitPos + startBitPos);
//清除不必要的高位
int-tempValue=intNum>>(31-endBitPos+startBitPos);

就个人而言,我觉得使用面具和移位比使用这种双重移位更舒服,但我发现很难想出像上面这样短的东西。

如果你只有两个固定长度的“面具”,你可以明确地存储它们,并像这样使用它们:

int [] masks = new int [4];
int masks[0] = 0x11111111;
int masks[1] = 0x111100000000;
// ...

public int getValue(int input, int mask){
    return input & masks[i];
}

出于好奇,为什么要这样使用
int
,而不是将每个值单独存储在自己的类型中?代码正确吗?我想知道符号位会发生什么。数据来自硬件。他们想节省空间。所有值都是无符号的。在这种情况下,代码是错误的。如果在尝试获取高位时将其设置在最左上角字节中,则返回负值。我认为该代码不正确(如果我理解问题的话)。他想得到位所代表的实际值,这意味着你必须将它们向下移动(并注意符号位),你是对的@Kaj。如果是这样的话,你还需要为每个掩码存储一个数字,说明你必须向下移动一个值才能得到正确的结果。这个代码是不正确的。它返回了错误的结果,例如bitsValue(0x8000001,24,32)@Kaj:endBitPos怎么可能是32?这是一个32位整数的结尾。我假设它们都是基于0的比特数,两者都包括在内。然而,有一个错误的标志
bitsValue(0x8000001,24,31)
现在返回128,这是我所期望的。要使
endBitPos
成为独占的,您只需将31s更改为32。这就是问题所在,它应该是包含的还是独占的?对于
位值(0x8000001,24,31)
返回128可能是正确的。该方法可能需要javadoc:ed。从右到左读取起始位是非常混乱的。@Kaj:在我看来不是这样的-在标记位时,位0几乎总是最低有效位。位0对我来说也是lsb,但我从左到右读取,所以我会说起始位是31,结束位是24。这就是为什么我想在这个方法上使用javadoc。我不认为只有我一个人会把它用错。
public static int bitsValue(int intNum, int startBitPos, int endBitPos) 
{           
    int mask = ~0; //or 0xffffffff
    //parameters checking ignored for now        
    mask = ~(mask<<(endBitPos)) & mask<<startBitPos
    return intNum & mask;
}
0xff000000 // is the 8 most significant bits  
0x00e00000 // is the next3 bits and  
0x001fffff // are the remaining 21 bits