是否有针对.NET Micro Framework的BitArray替代方案?我在考虑简单地使用bool [],但是如何将它转换回byte []?
在完整的框架中,考虑"位"是BitArray,以下工作:
byte[] data = new byte[dimensions / 8];
bits.CopyTo(data, 0);
Run Code Online (Sandbox Code Playgroud)
但我似乎无法在微框架中找到BitArray类
BitArray bits=new BitArray(16); // size 16-bit
Run Code Online (Sandbox Code Playgroud)
有 bitArray,我想在 C# 中将此数组中的 16 位转换为无符号整数,我不能使用 copyto 进行转换,是否还有其他方法可以从 16-bitto 转换为UInt16?
我正在使用Dipperstein的bitarray.cpp类来处理双层(黑白)图像,其中图像数据本身就像一位像素一样存储.
我需要使用for循环遍历每个位,每个图像大约4-9百万像素,数百个图像,类似于:
for( int i = 0; i < imgLength; i++) {
if( myBitArray[i] == 1 ) {
// ... do stuff ...
}
}
Run Code Online (Sandbox Code Playgroud)
性能可用,但并不令人惊讶.我通过gprof运行程序,发现有很多时间和数百万次调用std::vector迭代器和开始等方法.这是顶部采样函数:
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls s/call s/call name
37.91 0.80 0.80 2 0.40 1.01 findPattern(bit_array_c*, bool*, int, int, int)
12.32 1.06 0.26 98375762 0.00 0.00 __gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > >::__normal_iterator(unsigned char const* const&)
11.85 1.31 0.25 …Run Code Online (Sandbox Code Playgroud) 计算机如何知道(int x,y)x << y意味着移位y位?我不是指转变部分.我的意思是那y部分.计算机是否将x移位1并从y中减去1直到y == 0?如果不是,计算机如何计算y的值?
如果说y = 10,那么二进制表示是0b1010.计算机不能简单地拿走1010它并使用它,可以吗?
我试图为大于8的位大小.由于值不是简单地存储为标准整数的数组,容器不表示值,因此重载运算符<<并且>>有点困难.但是,从100位数字倒计数到0有点效率低,所以我试图找到一种方法让计算机更快地理解位数.
描述我错过理解的最好方法是使用代码本身:
var emptyByteArray = new byte[2];
var specificByteArray = new byte[] {150, 105}; //0x96 = 150, 0x69 = 105
var bitArray1 = new BitArray(specificByteArray);
bitArray1.CopyTo(emptyByteArray, 0); //[0]: 150, [1]:105
var hexString = "9669";
var intValueForHex = Convert.ToInt32(hexString, 16); //16 indicates to convert from hex
var bitArray2 = new BitArray(new[] {intValueForHex}) {Length = 16}; //Length=16 truncates the BitArray
bitArray2.CopyTo(emptyByteArray, 0); //[0]:105, [1]:150 (inversed, why??)
Run Code Online (Sandbox Code Playgroud)
我一直在读,bitarray从LSB迭代到MSB,那么从十六进制字符串开始初始化bitarray的最佳方法是什么呢?
输入是存储在连续存储器中的比特阵列,每1比特存储器具有1比特的比特阵列.
输出是比特阵列的设定位索引的数组.
例:
bitarray: 0000 1111 0101 1010
setA: {4,5,6,7,9,11,12,14}
setB: {2,4,5,7,9,10,11,12}
Run Code Online (Sandbox Code Playgroud)
获得A组或B组都可以.该集存储为uint32_t数组,因此该集的每个元素都是数组中的无符号32位整数.
如何在单个cpu核心上快5倍左右?
当前代码:
#include <iostream>
#include <vector>
#include <time.h>
using namespace std;
template <typename T>
uint32_t bitarray2set(T& v, uint32_t * ptr_set){
uint32_t i;
uint32_t base = 0;
uint32_t * ptr_set_new = ptr_set;
uint32_t size = v.capacity();
for(i = 0; i < size; i++){
find_set_bit(v[i], ptr_set_new, base);
base += 8*sizeof(uint32_t);
}
return (ptr_set_new - ptr_set);
}
inline void find_set_bit(uint32_t n, uint32_t*& ptr_set, uint32_t base){
// Find the set bits …Run Code Online (Sandbox Code Playgroud) 我创建了以下函数,它将按要求执行(将HEX字符串转换为BitArray).我不确定函数的效率,但我现在的主要问题是Convert.ToInt64函数是特定于endian的.当将其移植到备用芯片组时,我们将得到不同的结果(或例外).所以有人能想到另一种方法来进行这种转换吗???
public BitArray convertHexToBitArray(string hexData)
{
string binary_values = "";
BitArray binary_array;
if (hexData.Length <= "FFFFFFFFFFFFFFFF".Length) // Max Int64
{
binary_values = Convert.ToString(Convert.ToInt64(hexData, 16), 2);
binary_array = new BitArray(binary_values.Length);
for (int i = 0; i < binary_array.Length; i++)
{
if (binary_values[i] == '0')
{
binary_array[i] = false;
}
else
{
binary_array[i] = true;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我删除了大部分错误/异常处理,以保持这个大小,所以请原谅.
public static int getIntegerFromBitArray(BitArray bitArray)
{
var result = new int[1];
bitArray.CopyTo(result, 0);
return result[0];
}
// Input A) 01110
// Output A) 14
// Input B) 0011
// Output B) 12 <=== ????? WHY!!! :)
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下为什么我的第二个返回值是12而不是3?求求你了,谢谢你.
我试图转换一个位数组,如[0,0,1,0].to_i = 2或[0,1,0,1].to_i = 5.
在Ruby中有哪些可行的方法?
生成一组类似bitarray的对象的最佳方法是什么,以便我可以有效地测试成员资格.天真的方式似乎没有像我期望的那样起作用:
>>> from bitarray import bitarray
>>>
>>> bitarray_set = set([bitarray('0000'), bitarray('0001')])
>>> bitarray_set
set([bitarray('0001'), bitarray('0000')])
>>>
>>> bitarray('0000') in bitarray_set
False
Run Code Online (Sandbox Code Playgroud)
解决方法是将一组单独的字符串或其他更友好的对象保存为键.然后将bitarray转换为字符串并测试该集合的成员资格.但这似乎有点麻烦.有更好的解决方案吗?