Tag: 位操作

如何使用按位运算符交错2个布尔值?

假设我有两个4位值, ABCD和abcd 。 如何使用按位运算符对其进行交错,使其成为AaBbCcDd ? 伪C中的示例: nibble a = 0b1001; nibble b = 0b1100; char c = foo(a,b); print_bits(c); // output: 0b11010010 注意:4位仅用于说明,我想用两个32位整数执行此操作。

C比较两个位图的最快方法

char数组forms有两个位图数组,有数百万条记录。 什么可能是使用C比较它们的最快方法。 我可以想象在for循环中一次使用按位运算符xor 1个字节。 关于位图的重点: 算法运行的时间为1%到10%,位图可能不同。 大多数时候他们都是一样的。 当嘿可以不同时,它们可以高达100%。 连续条纹中的位变化概率很高。 两个位图的长度相同。 目标: 检查它们是否有所不同,如果是,则在哪里。 每次都是正确的(如果有的话,检测错误的概率应为1)。

K&R中的位计数function

在K&R的“C编程语言”一书中,有一个位计数function: int bitsCount(unsigned x) { int b; for (b = 0; x != 0; x >>= 1) if (x & 01) b++; return b; } 我的问题是为什么他们使用x&01而不是x&1或x&00000001 ? 是不是01表示八进制1?

如何对像素数据进行位条带化处理?

我有3个缓冲区,包含在32位处理器上运行的R,G,B位数据。 我需要以下列方式组合三个字节: R[0] = 0b r1r2r3r4r5r6r7r8 G[0] = 0b g1g2g3g4g5g6g7g8 B[0] = 0b b1b2b3b4b5b6b7b8 int32_t Out = 0b r1g1b1r2g2b2r3g3 b3r4g4b4r5g5b5r6 g6b6r7g7b7r8g8b8 xxxxxxxx 其中xxxxxxxx继续到缓冲区中的每个下一个字节。 我正在寻找一种最佳的组合方式。 我的方法绝对没有效率。 这是我的方法 static void rgbcombineline(uint8_t line) { uint32_t i, bit; uint8_t bitMask, rByte, gByte, bByte; uint32_t ByteExp, rgbByte; uint8_t *strPtr = (uint8_t*)&ByteExp; for (i = 0; i < (LCDpixelsCol / 8); […]

设置或重置给定位而不分支

在一次采访中,他们问我,你如何设置或重置一下? 这是一个非常简单的问题,我回答了这个问题。 之后他们问我, without branching就做到了。 我不知道什么是分支。 我搜索了那个,我来到这里http://graphics.stanford.edu/~seander/bithacks.html 但仍然没有得到分支和非分支的概念。 请解释Branching 。

在位数组中有效地找到’1’的位置

我正在连接一个测试一组电线的程序,用于开路或短路。 该程序在AVR上运行,将测试向量(步行’1’)驱动到导线上并接收结果。 它将此结果向量与已存储在SD卡或外部EEPROM中的预期数据进行比较。 这是一个例子,假设我们有一组8条线,所有这些线都是直通的,即它们没有连接点。 因此,如果我们驱动0b00000010,我们应该收到0b00000010。 假设我们收到0b11000010。 这意味着线7,8和线2之间存在短路。我可以通过0b00000010 ^ 0b11000010 = 0b11000000检测我感兴趣的位。 这告诉我显然线7和8有故障,但我如何在一个大的位arrays中有效地找到这些’1’的位置。 使用位掩码只需8线即可轻松完成此操作,但我正在开发的系统必须能够处理多达300线(位)。 在我开始使用如下的宏并测试300 * 300位数组中的每个位之前,我想问一下是否有更优雅的解决方案。 #define BITMASK(b) (1 << ((b) % 8)) #define BITSLOT(b) ((b / 8)) #define BITSET(a, b) ((a)[BITSLOT(b)] |= BITMASK(b)) #define BITCLEAR(a,b) ((a)[BITSLOT(b)] &= ~BITMASK(b)) #define BITTEST(a,b) ((a)[BITSLOT(b)] & BITMASK(b)) #define BITNSLOTS(nb) ((nb + 8 – 1) / 8) 只是为了进一步说明如何检测开路。 预期数据:0b00000010,接收数据:0b00000000(导线未拉高)。 […]

Bitwise memmove

实现按位memmove的最佳方法是什么? 该方法应该采用额外的目标和源位偏移,并且计数也应该是位。 我看到ARM提供了一个非标准的_membitmove ,它正是我所需要的,但我找不到它的来源。 Bind的bitset包括isc_bitstring_copy ,但效率不高 我知道C标准库没有提供这样的方法,但我也找不到提供类似方法的任何第三方代码。

在另一个整数的MSB位置左侧的整数中查找N个连续的零位

问题是:给定一个整数val1找到最高位集(最高有效位)的位置然后,给定第二个整数val2找到从第一个整数产生的位置左边的未设置位的连续区域。 width指定必须在邻接中找到的最小未设置位数(即width为零且没有其中的一些)。 这是我的解决方案的C代码: #include /* for CHAR_BIT – number of bits in a char */ typedef unsigned int t; unsigned const t_bits = sizeof(t) * CHAR_BIT; _Bool test_fit_within_left_of_msb( unsigned width, t val1, /* integer to find MSB of */ t val2, /* integer to find width zero bits in */ unsigned* offset_result) { unsigned offbit […]

将有符号整数除以2的幂

我正在研究一种方法,只使用二元运算符(<> + ^〜&|!)将有符号整数除以2的幂,结果必须向0舍入。我也遇到了这个问题关于问题的Stackoverflow,我无法理解为什么它的工作原理。 这是解决方案: int divideByPowerOf2(int x, int n) { return (x + ((x >> 31) & ((1 <> n; } 我理解x >> 31部分(如果x是负数,则仅添加下一部分,因为如果它是正x则将自动向0舍入)。 但令我困扰的是(1 << n) + ~0部分。 它怎么样?

为什么向上移位int会产生负数?

我是位操作技巧的新手,我写了一个简单的代码,看看在单个数字上进行单位移位的输出。 2 #include int main(int argc, char *argv[]) { int num=2; do { std::cout<<num<<std::endl; num=num<<1;//Left shift by 1 bit. } while (num!=0); return 0; } 输出如下。 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576 2097152 4194304 8388608 16777216 33554432 67108864 134217728 268435456 536870912 […]