Java中的Delphi SetBit-function和TBitRange-类型

时间:2016-05-22 17:45:29

标签: java delphi encryption

我必须在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中的实际位位置参数?我们可以不使用整数来表示中的位位置吗?

1 个答案:

答案 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中实际上不可能做这个假数组技巧。