我必须在Java中实现以下Delphi函数,但无论如何TBitRange类型让我感到困惑。在Java中有没有替代方案? 也许任何人都可以解释这个功能究竟在做什么。
感谢。
static int bitsPerInteger = Integer.SIZE;
public int setBit(int value, byte bit)
{
int result = value | (1 << (bit % bitsPerInteger));
return result;
}
在我的Java中,我将此setBit函数实现为:
{{1}}
如果我理解正确,此函数返回值的副本,位置位设置。 bitsPerInteger 变量是 Integer.SIZE 并且等于32.对于测试,我创建了两个变量:byte bits = 0x34;它等于52为整数,int值= 4;。指令位%bitsPerInteger;在这种情况下,delievers 20和值| (1&lt;(bits%bitsPerInteger))将值的第20位设置为1然后它等于1048576.所以我将这两个变量作为参数交给然后得到1048576.这是正确的吗?
为什么需要将类型为 Byte 的变量作为位置参数移交,然后通过 mod -operation获取bit-String中的实际位位置参数值?我们可以不使用整数来表示值中的位位置吗?
答案 0 :(得分:2)
理想情况下TBitRange
应该是一个子范围,例如:
type
TBitRange = 0..31;
子编辑在编译时强制执行 Java没有子范围,所以没有等价物。
您可以按如下方式声明该功能:
public static int SetBit(final int Value, final byte Bit)
{
assert bit >= 0;
assert bit <= 31;
final int shift = 1 << Bit;
return Value | shift;
}
不幸的是,只在运行时检查断言。
但是,在您之前删除的问题中,您将TBitRange定义为:
type
TBitRange = Byte;
Java中的byte
类型是有符号的,而Delphi中的byte
类型是无符号的。 Java中没有无符号的8位int。出于问题的目的,虽然签名的Java字节可以正常工作。
关于shl
Delphi的shl
/ shr
遵循x86 sematics,因此整数为32。因此mod BitsPerInteger
部分毫无意义。该语言已根据其规范执行此操作(即someint shl 32
是无操作)。
Java does the same thing所以在Java中也不需要mod。
这个功能究竟在做什么?
就像它在标签上所说:它设置了一点
整数是32位类型
这意味着变量内部有32位(开/关开关,即布尔值)
它们的编号从0到31
如果你想节省空间,你可以使用这个事实在一个整数中存储32个布尔值,而不必使用32个变量。这将32个字节压缩成4个字节;减少8倍
在Delphi中,我们通常使用set of ...
。 Java没有集合,因此您不得不求助于使用位域。
位域实际上是压缩的array of boolean
,但由于位域没有数组语法,因此您必须使用函数。
BoolArray[8]:= true -> BitField:= SetBit(BitField,8);
if BoolArray[8] then ... -> if GetBit(BitField,8) then ...
显然在Delphi中你可以使用属性来模拟它:
TBitField = record
private
FStorage: integer;
function GetBit(Index: TBitRange): boolean;
procedure SetBit(Index: TBitRange; const Value: boolean);
public
property IsTrue[Index: TBitRange]: boolean read GetBit write SetBit;
end;
Properties
是Java没有的另一件事,所以在Java中实际上不可能做这个假数组技巧。