Questions tagged «bitwise-operators»

用于在位级别上进行操作的运算符。编程语言是针对字节的,而硬件是面向比特的。因此,能够在位级别进行操作在编程中非常重要,尤其是当程序直接与硬件交互时。


13
!!〜(不是波浪线/爆炸波浪线)如何改变“包含/包含” Array方法调用的结果?
如果您在此处的jQuery inArray页面上阅读了注释,则会有一个有趣的声明: !!~jQuery.inArray(elm, arr) 现在,我相信双感叹号会将结果转换为type boolean,其值为true。我不明白的是,~在所有这些中,tilde()运算符的用途是什么? var arr = ["one", "two", "three"]; if (jQuery.inArray("one", arr) > -1) { alert("Found"); } 重构if语句: if (!!~jQuery.inArray("one", arr)) { alert("Found"); } 分解: jQuery.inArray("one", arr) // 0 ~jQuery.inArray("one", arr) // -1 (why?) !~jQuery.inArray("one", arr) // false !!~jQuery.inArray("one", arr) // true 我还注意到,如果将波浪号放在前面,结果是-2。 ~!!~jQuery.inArray("one", arr) // -2 …

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 ...所以?

6
在Android中删除油漆标志
我的代码如下所示: TextView task_text = (TextView) view.findViewById(R.id.task_text); task_text.setPaintFlags( task_text.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); 这将导致删除线效果出现在文本上。但是,我想知道如何在设置标志后删除该标志,以及如何检测已设置标志。 我知道这是个按位操作,但是我尝试了〜和-运算符,但都没有用。


9
在C ++中对布尔值使用按位运算符
是否有任何理由不对C ++中的“布尔”值使用按位运算符&,|和^? 有时我遇到两种情况,我希望精确地满足两个条件之一(XOR),因此我只是将^运算符放入条件表达式中。有时我还希望评估条件的所有部分,无论结果是否正确(而不是短路),因此我使用&和|。有时我还需要累积布尔值,并且&=和| =可能非常有用。 在执行此操作时,我有些挑剔,但是代码仍然比其他代码有意义且更简洁。有没有理由不将其用于布尔?是否有任何现代编译器为此带来不好的结果?

9
这是在C中实现+运算符的方式吗?
当了解如何原始的运营商,如+,-,*并/用C实现,我发现从下面的代码片段一个有趣的答案。 // replaces the + operator int add(int x, int y) { while(x) { int t = (x & y) <<1; y ^= x; x = t; } return y; } 似乎该功能演示了如何+在后台实际工作。但是,这让我难以理解。我相信这种操作是使用编译器生成的汇编指令很长时间完成的! +操作员是否按照发布在MOST实施中的代码实施?这是否利用了二进制补码或其他与实现相关的功能?

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的简并情况,只需使用排序列表并对特定输入值进行二进制搜索。 …

4
JavaScript中的&和&&有什么区别?
JavaScript中的&和&&有什么区别? 示例代码: var first = 123; var second = false; var third = 456; var fourth = "abc"; var fifth = true; alert(first & second); // 0 alert(first & third); // 72 alert(first & fourth); // 0 alert(first & fifth); // 1 alert(first && second); // false alert(first && third); …

13
逐位运算的实际应用
从目前的情况来看,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 您对位运算使用了什么? 他们为什么这么方便? 有人可以推荐一个非常简单的教程吗?



16
我在JavaScript的哪儿使用按位运算符?
我读过“什么是按位运算符?” ,所以我知道什么是 按位运算符,但仍不清楚如何使用它们。谁能提供在JavaScript中有用的按位运算符的真实示例吗? 谢谢。 编辑: 深入研究jQuery源,我发现了几个使用按位运算符的地方,例如:(仅&运算符) // Line 2756: event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); // Line 2101 var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? …

5
按位运算会导致意外的可变大小
语境 我们正在移植最初使用PIC单片机的8位C编译器编译的C代码。为了防止无符号全局变量(例如,错误计数器)回滚到零,使用了一个常见的习惯用法: if(~counter) counter++; 此处的按位运算符将所有位取反,并且仅当counter小于最大值时该语句才为真。重要的是,无论变量大小如何,此方法均有效。 问题 我们现在的目标是使用GCC的32位ARM处理器。我们注意到,相同的代码会产生不同的结果。据我们所知,按位补码运算返回的值与我们期望的大小不同。为了重现这一点,我们在GCC中进行编译: uint8_t i = 0; int sz; sz = sizeof(i); printf("Size of variable: %d\n", sz); // Size of variable: 1 sz = sizeof(~i); printf("Size of result: %d\n", sz); // Size of result: 4 在输出的第一行中,我们得到的是:i1个字节。但是,的按位补码i实际上是四个字节,这会引起问题,因为与此进行比较现在无法给出预期的结果。例如,如果这样做(在哪里i是正确初始化的uint8_t): if(~i) i++; 我们将看到i从0xFF到0x00的“环绕”。与以前的编译器和8位PIC微控制器中预期的运行方式相比,GCC的行为有所不同。 我们知道我们可以通过如下方式解决此问题: if((uint8_t)~i) i++; 或者,通过 if(i < 0xFF) …

5
比较一下布尔值
假设我有一组以uint16_t编码的标志flags。例如,AMAZING_FLAG = 0x02。现在,我有一个功能。此函数需要检查是否要更改标志,因为如果要更改标志,则需要写入闪存。那很贵。因此,我想要一张支票告诉我是否flags & AMAZING_FLAG等于doSet。这是第一个想法: setAmazingFlag(bool doSet) { if ((flags & AMAZING_FLAG) != (doSet ? AMAZING_FLAG : 0)) { // Really expensive thing // Update flags } } 这不是直观的if语句。我觉得应该有更好的方法,例如: if ((flags & AMAZING_FLAG) != doSet){ } 但这实际上不起作用,true似乎等于0x01。 因此,有没有一种比较布尔值的好方法?
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.