我目前使用这两个函数来打包和读取字节数组中的位.想知道是否有人有更好的想法或更快的方法吗?
通过更多优化编辑程序并提出一些计算.目前100mil的Put and Get大约需要12秒而不是16秒.
如果有人正在使用当前代码,请确保传入Put的值是正数,因为它期望无符号数字下降.如果有兴趣,我可以提出签名和未签名的版本.
class BitData
{
static void Put(byte Data[], final int BitOffset, int NumBits, final int Value)
{
final long valLong=(Value&((1L<<NumBits)-1L));
int posByte=BitOffset>>3;
int posBit=BitOffset&7;
int valByte;
int ModifyBits;
long lValue;
int LeftShift;
ModifyBits=8-posBit;
if(NumBits<ModifyBits) ModifyBits=NumBits;
LeftShift=(8-posBit-ModifyBits);
while(true)
{
valByte = Data[posByte];
if(ModifyBits==8)
{
lValue=valLong<<(32-NumBits)>>(24);
Data[posByte]=(byte)lValue;
}
else
{
lValue=valLong<<(32-NumBits)>>(32-ModifyBits)<<LeftShift;
Data[posByte]=(byte)((valByte & ~(((1<<ModifyBits)-1) << LeftShift)) | lValue);
}
NumBits-=ModifyBits;
if(NumBits==0) break;
posByte++;
ModifyBits=8;
if(NumBits<ModifyBits)
{
ModifyBits=NumBits;
LeftShift=(8-ModifyBits);
}
}
}
static int GetInt(byte Data[], final int BitOffset, …Run Code Online (Sandbox Code Playgroud) 我想创建一个大小的布尔数组,用户将其作为输入.例如 - 用户可能会输入一个大数字,如1000000000000; 所以我必须创建一个大小为1000000000000的布尔数组.我面临的问题是,我不能将输入存储为int,因为它无法容纳如此大的数字 - 因此我无法创建数组.Double是一个选项.我可以将输入数字存储为double,但我不知道如何创建双数字大小的数组.这就是这个想法 -
Scanner scanner = new Scanner(System.in);
int target = scanner.nextInt();
boolean [] array_a=new boolean [(target)];
Run Code Online (Sandbox Code Playgroud)
如果目标超过int范围,它将无法工作.任何帮助表示赞赏.
更新:谢谢大家.所以你只能创建一个int的最大范围(2147483648)大小的数组,对吧?内存方面没有提到我.要采取不同的方法.