相关疑难解决方法(0)

Byte[] 到 BitArray 再返回 Byte[]

正如标题所述,我正在尝试将字节数组转换为位数组,然后再次转换回字节数组。

我知道这Array.CopyTo()可以解决这个问题,但由于 BitArray 在 LSB 中存储值的方式,收到的字节数组与原始字节数组不同。

你如何在 C# 中实现它?

.net c# visual-studio

5
推荐指数
1
解决办法
5157
查看次数

使用反射输入计算 CRC64 的最有效方法

我需要使用这个设置计算一个 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)

c performance crc32 crc crc64

5
推荐指数
1
解决办法
854
查看次数

你如何在python中反转整数的有效位?

在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这不是功课,我只是试图将解决方案编程为逻辑谜题.

python bit-manipulation

4
推荐指数
3
解决办法
9106
查看次数

如何在C中翻转和反转int?

例如:

输入:01011111

输出:00000101

我知道我可以使用~翻转数字,但我不知道逆转它的好方法.而且我不确定他们是否可以一起完成.

有没有人有任何想法?

c bit-manipulation

4
推荐指数
1
解决办法
2138
查看次数

ARM上的LSB到MSB位反转

我需要用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可能很有用.

arm bit-manipulation neon

4
推荐指数
2
解决办法
5647
查看次数

python3中的高效比特点击

我在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'工作)

这是我输入数据的一个例子

有没有人知道一个快速的方法,做上述任务?

python algorithm bit-manipulation python-3.x

4
推荐指数
1
解决办法
179
查看次数

avx2寄存器位反转

是否有(快速)方法在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)

c++ x86 simd avx2

2
推荐指数
1
解决办法
572
查看次数

反转整数x中的位

位反转

我发现这个代码用于反转整数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)

我无法理解此代码背后的逻辑/算法.所有神奇数字的目的是什么?

bit

1
推荐指数
1
解决办法
820
查看次数

有没有标准的C函数用于bitwapping?

可能重复:C
中位反转的最佳算法(从MSB-> LSB到LSB-> MSB)

我有一个64位字,我想对它进行以下操作.

首先,我想做一个比特交换(交换比特63与比特0交换比特62与比特1,依此类推)

完成上述操作后,我想在字节0和字节7字节1和字节6之间进行字节交换交换,依此类推.

现在我们在gcc linux中有一个内置函数来做第二部分bswap_64().有没有任何函数可以做第一部分在gcc linux C中可用

c linux bit-manipulation

1
推荐指数
1
解决办法
1666
查看次数

反转整数位

我是通过一个面试问题来的。反转 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)

在这之后,有一个后续问题——如果这个函数被多次调用,你会如何优化它?我无法弄清楚在那种情况下应该如何优化解决方案。

c++ algorithm bit-manipulation

1
推荐指数
1
解决办法
438
查看次数

标签 统计

bit-manipulation ×6

c ×3

algorithm ×2

c++ ×2

python ×2

.net ×1

arm ×1

avx2 ×1

bit ×1

c# ×1

crc ×1

crc32 ×1

crc64 ×1

linux ×1

neon ×1

performance ×1

python-3.x ×1

simd ×1

visual-studio ×1

x86 ×1