正如标题所述,我正在尝试将字节数组转换为位数组,然后再次转换回字节数组。
我知道这Array.CopyTo()可以解决这个问题,但由于 BitArray 在 LSB 中存储值的方式,收到的字节数组与原始字节数组不同。
你如何在 C# 中实现它?
我需要使用这个设置计算一个 CRC-64到这个美妙的网站:http : //www.sunshine2k.de/coding/javascript/crc/crc_js.html
如您所见,我需要“反射输入”,这意味着我需要反转任何字节的位顺序(有点烦人)。目前,我使用查找表(例如 0x55 -> 0xAA)实现了这一点,但我想知道是否有任何 CRC 属性可以用来提高效率。
这是我的代码(在 C 中):
static const unsigned long long CRC64_TABLE[256] = {
0x0000000000000000, 0x42F0E1EBA9EA3693, 0x85E1C3D753D46D26, 0xC711223CFA3E5BB5, 0x493366450E42ECDF, 0x0BC387AEA7A8DA4C, 0xCCD2A5925D9681F9, 0x8E224479F47CB76A,
0x9266CC8A1C85D9BE, 0xD0962D61B56FEF2D, 0x17870F5D4F51B498, 0x5577EEB6E6BB820B, 0xDB55AACF12C73561, 0x99A54B24BB2D03F2, 0x5EB4691841135847, 0x1C4488F3E8F96ED4,
0x663D78FF90E185EF, 0x24CD9914390BB37C, 0xE3DCBB28C335E8C9, 0xA12C5AC36ADFDE5A, 0x2F0E1EBA9EA36930, 0x6DFEFF5137495FA3, 0xAAEFDD6DCD770416, 0xE81F3C86649D3285,
0xF45BB4758C645C51, 0xB6AB559E258E6AC2, 0x71BA77A2DFB03177, 0x334A9649765A07E4, 0xBD68D2308226B08E, 0xFF9833DB2BCC861D, 0x388911E7D1F2DDA8, 0x7A79F00C7818EB3B,
0xCC7AF1FF21C30BDE, 0x8E8A101488293D4D, 0x499B3228721766F8, 0x0B6BD3C3DBFD506B, 0x854997BA2F81E701, 0xC7B97651866BD192, 0x00A8546D7C558A27, 0x4258B586D5BFBCB4,
0x5E1C3D753D46D260, 0x1CECDC9E94ACE4F3, 0xDBFDFEA26E92BF46, 0x990D1F49C77889D5, 0x172F5B3033043EBF, 0x55DFBADB9AEE082C, 0x92CE98E760D05399, 0xD03E790CC93A650A,
0xAA478900B1228E31, 0xE8B768EB18C8B8A2, 0x2FA64AD7E2F6E317, 0x6D56AB3C4B1CD584, 0xE374EF45BF6062EE, 0xA1840EAE168A547D, 0x66952C92ECB40FC8, 0x2465CD79455E395B, …Run Code Online (Sandbox Code Playgroud) 在python中反转整数的有效位然后从中得到结果整数的最佳方法是什么?
例如,我有数字1,2,5,15,我想反转这样的位:
original reversed
1 - 0001 - 1000 - 8
2 - 0010 - 0100 - 4
5 - 0101 - 1010 - 10
15 - 1111 - 1111 - 15
Run Code Online (Sandbox Code Playgroud)
鉴于这些数字是32位整数,我应该如何在python中执行此操作?我不确定的部分是如何在python中移动单个位,如果在执行此操作后将32位字段用作整数则有任何有趣之处.
PS这不是功课,我只是试图将解决方案编程为逻辑谜题.
例如:
输入:01011111
输出:00000101
我知道我可以使用~翻转数字,但我不知道逆转它的好方法.而且我不确定他们是否可以一起完成.
有没有人有任何想法?
我需要用LSB中的每个字节而不是MSB来反转YUV图像.我已经在C中读取了用于位反转的最佳算法(从MSB-> LSB到LSB-> MSB)但是我想做一些经过ARM优化的东西.
int8 *image;
for(i = 0; i < size; i++) {
image[i] = reversebit8(image[i]); //Use the lookup mechanism
}
Run Code Online (Sandbox Code Playgroud)
当我控制图像格式(双字节YUYV或任何排列)时,我可以反转16位:
int16 *image;
for(i = 0; i < size / 2; i++) {
image[i] = reversebit16(image[i]);
}
Run Code Online (Sandbox Code Playgroud)
图像从YUYV LSB到UYVY MSB.甚至是32位:
int32 *image;
for(i = 0; i < size / 4; i++) {
image[i] = reversebit32(image[i]);
}
Run Code Online (Sandbox Code Playgroud)
图像从YUYV LSB变为VYUY MSB.
问题:如何以优化的方式为ARM执行此操作?霓虹灯也很好.
我认为这些说明http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.kui0100a/armasm_cihjgdid.htm可能很有用.
我在python3中处理bitswapping非常困难.
到目前为止,我在这里和这里找到了C中的快速bitwapping算法,但我无法正确地将其转换为python3,因为处理数据,使用正确的数据类型而不会被不同的编码混淆对我来说是不可能的.
对我有用的唯一解决方案是使用BitArray进行这样的交换:
with open(file_swapped, 'wb') as out, open(file, 'rb') as inp:
byte_in = inp.read(1)
while byte_in:
tmp = bitstring.BitArray(byte_in)
tmp.reverse()
byte_out = tmp._getbytes()
byte_in = inp.read(1)
Run Code Online (Sandbox Code Playgroud)
但是,此算法需要2分钟以上的时间来处理需要进行比特换行的数据.该算法的分析表明,BitArray的创建占用了总时间的大部分时间.
每次尝试将二进制输入数据转换为'0'和'1'或整数的字符串,手动执行"交换"-part失败,因为数据没有特定的编码(utf-8/utf-16 didn'工作)
这是我输入数据的一个例子
有没有人知道一个快速的方法,做上述任务?
是否有(快速)方法在avx2寄存器中执行32位int值的位反转?例如
_mm256_set1_epi32(2732370386);
<do something here>
//binary: 10100010110111001010100111010010 => 1001011100101010011101101000101
//register contains 1268071237 which is decimal representation of 1001011100101010011101101000101
Run Code Online (Sandbox Code Playgroud) 位反转
我发现这个代码用于反转整数x中的位(假设为32位值):
unsigned int
reverse(register unsigned int x)
{
x = (((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1));
x = (((x & 0xcccccccc) >> 2) | ((x & 0x33333333) << 2));
x = (((x & 0xf0f0f0f0) >> 4) | ((x & 0x0f0f0f0f) << 4));
x = (((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8));
return((x >> 16) | (x << 16));
}
Run Code Online (Sandbox Code Playgroud)
我无法理解此代码背后的逻辑/算法.所有神奇数字的目的是什么?
我有一个64位字,我想对它进行以下操作.
首先,我想做一个比特交换(交换比特63与比特0交换比特62与比特1,依此类推)
完成上述操作后,我想在字节0和字节7字节1和字节6之间进行字节交换交换,依此类推.
现在我们在gcc linux中有一个内置函数来做第二部分bswap_64().有没有任何函数可以做第一部分在gcc linux C中可用
我是通过一个面试问题来的。反转 32 位无符号整数的位。我写了这个完全没问题的代码:
uint32_t reverseBits(uint32_t n) {
for(int i = 0, j = 31; i < j; i++, j--) {
bool iSet = (bool)(n & (1 << i));
bool jSet = (bool)(n & (1 << j));
n &= ~(1 << j);
n &= ~(1 << i);
if(iSet) n |= (1 << j);
if(jSet) n |= (1 << i);
}
return n;
}
Run Code Online (Sandbox Code Playgroud)
在这之后,有一个后续问题——如果这个函数被多次调用,你会如何优化它?我无法弄清楚在那种情况下应该如何优化解决方案。