我需要一个布尔数组的紧凑表示,Python有内置的位域类型还是我需要找到一个替代解决方案?
我想创建一个非常大的数组,我在其上写'0'和'1'.我试图模拟一个称为随机顺序吸附的物理过程,其中长度为2的单位二聚体在随机位置沉积在n维晶格上,彼此不重叠.当晶格上没有剩余空间用于沉积更多二聚体(晶格被堵塞)时,该过程停止.
最初我从一个零点开始,二聚体用一对'1'表示.当每个二聚体沉积时,二聚体左侧的位点被阻断,这是因为二聚体不能重叠.因此,我通过在晶格上存储三个'1'来模拟这个过程.我需要重复整个模拟很多次,然后计算出平均覆盖率%.
我已经使用1D和2D格子的字符数组完成了这项工作.目前,我正在尝试使代码尽可能高效,然后再处理3D问题和更复杂的概括.
这基本上是1D中代码的样子,简化:
int main()
{
/* Define lattice */
array = (char*)malloc(N * sizeof(char));
total_c = 0;
/* Carry out RSA multiple times */
for (i = 0; i < 1000; i++)
rand_seq_ads();
/* Calculate average coverage efficiency at jamming */
printf("coverage efficiency = %lf", total_c/1000);
return 0;
}
void rand_seq_ads()
{
/* Initialise array, initial conditions */
memset(a, 0, N * sizeof(char));
available_sites = N;
count = 0;
/* While the lattice still has enough room... */ …Run Code Online (Sandbox Code Playgroud) 我有一个BitArray长度为8,我需要一个函数将其转换为byte.怎么做?
具体来说,我需要一个正确的功能ConvertToByte:
BitArray bit = new BitArray(new bool[]
{
false, false, false, false,
false, false, false, true
});
//How to write ConvertToByte
byte myByte = ConvertToByte(bit);
var recoveredBit = new BitArray(new[] { myByte });
Assert.AreEqual(bit, recoveredBit);
Run Code Online (Sandbox Code Playgroud) 我正在建立一个分析系统,API调用将提供唯一的用户ID,但它不是按顺序而且太稀疏.
我需要为每个唯一用户ID提供一个自动增量ID,以在bitarray/bitset中标记分析数据点.因此,第一个用户遇到的对应于比特阵列的第一个比特,第二个用户将是比特阵列中的第二个比特,等等.
那么在MongoDB中生成增量唯一用户ID有一种可靠而快速的方法吗?
我正在实现一个库,我广泛使用.Net BitArray类,需要等效的Java BitSet.Cardinality()方法,即返回设置的位数的方法.我正在考虑将其实现为BitArray类的扩展方法.平凡的实现是迭代和计数位集(如下所示),但我希望更快的实现,因为我将执行数千个集合操作并计算答案.有比下面的例子更快的方法吗?
count = 0;
for (int i = 0; i < mybitarray.Length; i++)
{
if (mybitarray [i])
count++;
}
Run Code Online (Sandbox Code Playgroud) 我正在为布尔2d数组编写一个函数:
function foo(A::Array{Bool,2})
...
end
Run Code Online (Sandbox Code Playgroud)
用它评估和测试它
A = randbool(3,3)
foo(A)
Run Code Online (Sandbox Code Playgroud)
回报
ERROR: 'foo' has no method matching foo(::BitArray{2})
Run Code Online (Sandbox Code Playgroud)
显然,randbool()生成一个BitArray,而我认为randbool()会产生一个Array{Bool}.
如何Array{Bool}和BitArray相关?为什么它们都存在?
我可以foo()用这样的方式编写它使用单一方法接受两种输入类型(因为我看不出差异)?
1). var bitValue = (byteValue & (1 << bitNumber)) != 0;
2).使用System.Collections.BitArray与Get(int index)方法
我有一个很长的位序列存储在一个无符号长整数数组中,就像这样
struct bit_array
{
int size; /* nr of bits */
unsigned long *array; /* the container that stores bits */
}
Run Code Online (Sandbox Code Playgroud)
我试图设计一种算法来反转*数组中的位顺序.问题:
size 可以是任何东西,即不一定是8或32等的倍数,因此输入数组中的第一位可以在输出数组中的无符号长整数内的任何位置结束;sizeof(unsigned long).代码,伪代码,算法描述等 - 比bruteforce("一点一滴")方法更好的方法是受欢迎的.
我正在寻找一种在Java中存储密集可变长度比特阵的非常紧凑的方法.现在,我正在使用BitSet,但它似乎平均使用1.5*n位存储空间用于大小为n的位向量.通常,这不是问题,但在这种情况下,存储的比特阵列是应用程序的内存占用量非常重要的部分.因此,让它们变得更小一点真的很有帮助.
BitSet所需的空间似乎是由于用于支持数据结构的long数组在每次扩展以容纳更多位时往往会加倍:
// BitSet's resizing code
private void ensureCapacity(int wordsRequired) {
if (words.length < wordsRequired) {
// Allocate larger of doubled size or required size
int request = Math.max(2 * words.length, wordsRequired);
words = Arrays.copyOf(words, request);
sizeIsSticky = false;
}
}
Run Code Online (Sandbox Code Playgroud)
我可以编写自己的BitSet替代实现,更加保守地扩展后端数据结构.但是,如果我不需要,我真的很讨厌复制标准类库中已有的功能.