Questions tagged «bit-manipulation»

单个位的操作。使用的运算符可能包括按位与,或,异或,非,左移和右移。

1
优先级和位掩码操作
我遇到了一个(看似)非常奇怪的案例。 取数字2(0b10)并用1(0b01)对其进行位掩码 这应产生0b00等于0的值。 但是,这里是薛定ding先生进来的地方: var_dump(0b10 & 0b01); // int(0) var_dump(0b10 & 0b01 == 0); // int(0) var_dump(0b10 & 0b01 != 0); // int(0) 威士忌酒。探戈 狐步舞。 坦率地说,对于按位运算符,我不是最聪明的人-所以也许我在某个地方犯了可怕的错误? 但是,在Python中: 0b10 & 0b01 == 0 = True 0b10 & 0b01 != 0 = False ...所以?


16
C ++中循环移位(旋转)操作的最佳实践
左和右移位运算符(<<和>>)已经在C ++中可用。但是,我找不到如何执行循环移位或旋转操作的方法。 如何执行“向左旋转”和“向右旋转”之类的操作? 在这里向右旋转两次 Initial --> 1000 0011 0100 0010 应导致: Final --> 1010 0000 1101 0000 一个例子会有所帮助。 (编者注:如果C的旋转数为零,或者编译成多个旋转机械指令,则许多用C表示旋转的常见方法都会遭受不确定的行为。此问题的答案应记录最佳实践。)

3
什么是CHAR_BIT?
引用代码以计算整数绝对值(abs),而无需从http://graphics.stanford.edu/~seander/bithacks.html分支: int v; // we want to find the absolute value of v unsigned int r; // the result goes here int const mask = v >> sizeof(int) * CHAR_BIT - 1; r = (v + mask) ^ mask; 专利变体: r = (v ^ mask) - mask; 什么是CHAR_BIT它,如何使用?

7
C / C ++:强制位字段顺序和对齐
我读到,结构中位字段的顺序是特定于平台的。如果我使用不同的特定于编译器的打包选项,那该如何保证数据在写入时以正确的顺序存储?例如: struct Message { unsigned int version : 3; unsigned int type : 1; unsigned int id : 5; unsigned int data : 6; } __attribute__ ((__packed__)); 在具有GCC编译器的Intel处理器上,这些字段如图所示布置在内存中。Message.version是缓冲区的前3位,然后Message.type是。如果我为各种编译器找到了等效的struct包装选项,这是否可以跨平台使用?


10
有没有一种优雅而又快速的方法来测试整数中的1位是否在连续区域中?
我需要测试位值1的位置(对于32位整数,从0到31)是否形成连续区域。例如: 00111111000000000000000000000000 is contiguous 00111111000000000000000011000000 is not contiguous 我希望此测试(即某些功能has_contiguous_one_bits(int))具有可移植性。 一种明显的方法是遍历位置以找到第一个置位,然后找到第一个非置位并检查是否还有其他置位。 我想知道是否存在更快的方法?如果有快速的方法来找到最高和最低的设置位(但是从这个问题看来似乎没有任何可移植的位),那么可能的实现方法是 bool has_contiguous_one_bits(int val) { auto h = highest_set_bit(val); auto l = lowest_set_bit(val); return val == (((1 << (h-l+1))-1)<<l); } 只是为了好玩,这是带有连续位的前100个整数: 0 1 2 3 4 6 7 8 12 14 15 16 24 28 30 31 32 48 56 …


11
饱和减/加无符号字节
假设我有两个无符号字节b和x。我需要计算bsubasb - x和baddas b + x。但是,我不希望在这些操作期间发生下溢/上溢。例如(伪代码): b = 3; x = 5; bsub = b - x; // bsub must be 0, not 254 和 b = 250; x = 10; badd = b + x; // badd must be 255, not 4 这样做的明显方法包括分支: bsub = b - min(b, x); …


3
增加“掩码”位集
我目前正在编写树枚举器的过程中遇到以下问题: 我正在查看被屏蔽的位集,即设置的位是掩码的子集的位集,即0000101具有mask的位集1010101。我要完成的是增加位集,但仅是相对于掩码位。在此示例中,结果将为0010000。为了使其更清晰,仅提取被屏蔽的位,即0011,将它们增加到0100并再次将它们分配给屏蔽位,得到0010000。 除了使用bitcans和前缀掩码的组合手动执行操作之外,有人能看到实现此目的的有效方法吗?

5
操纵Java / Android color int的alpha字节
如果我在Java中有一个int用作Android颜色(用于在Canvas上绘制),我该如何操作该int的alpha分量?例如,如何使用操作来做到这一点: int myOpaqueColor = 0xFFFFFF; float factor = 0; int myTransparentColor = operationThatChangesAlphaBytes(myOpaqueColor, factor); //myTransparentColor should now = 0x00FFFFFF; 理想情况下,最好将第一个字节乘以任何factor值,而不是仅将字节设置为静态值。

7
大集合中有效查找汉明距离低的二进制字符串
问题: 给定一个大的(约1亿个)无符号32位整数列表,一个无符号32位整数输入值以及最大汉明距离,请返回输入值指定汉明距离内的所有列表成员。 持有清单的实际数据结构是开放的,性能要求决定了内存中的解决方案,构建数据结构的成本是次要的,查询数据结构的低成本至关重要。 例: For a maximum Hamming Distance of 1 (values typically will be quite small) And input: 00001000100000000000000001111101 The values: 01001000100000000000000001111101 00001000100000000010000001111101 should match because there is only 1 position in which the bits are different. 11001000100000000010000001111101 should not match because 3 bit positions are different. 到目前为止,我的想法是: 对于汉明距离为0的简并情况,只需使用排序列表并对特定输入值进行二进制搜索。 …

5
以字节为单位设置特定位
我正在尝试在Java字节变量中设置位。它确实提供了类似的适当方法.setBit(i)。有人知道我该怎么实现吗? 我可以逐位遍历给定的字节: if( (my_byte & (1 << i)) == 0 ){ } 但是我不能将此位置设置为1或0,可以吗?

20
解释此片段,该片段不使用if-else或任何其他比较运算符就可以找到两个整数的最大值?
查找两个数字的最大值。您不应使用if-else或任何其他比较运算符。我在在线公告板上发现了这个问题,所以我认为我应该在StackOverflow中询问 示例输入:5、10输出:10 我找到了这个解决方案,有人可以帮我理解这些代码行吗 int getMax(int a, int b) { int c = a - b; int k = (c >> 31) & 0x1; int max = a - k * c; return max; }

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.