Questions tagged «bitwise-operators»

直接操作位模式和二进制数字的低级原始操作


2
为什么按位运算符的优先级比比较低?
有人可以解释其原理,为什么在一堆最流行的语言中(请参见下面的注释),比较运算符(==,!=,<,>,<=,> =)的优先级要高于按位运算符(&,|,^ ,〜)? 我认为我从未遇到过这种优先次序自然的用途。总是这样的: if( (x & MASK) == CORRECT ) ... // Chosen bits are in correct setting, rest unimportant if( (x ^ x_prev) == SET ) // only, and exactly SET bit changed if( (x & REQUIRED) < REQUIRED ) // Not all conditions satisfied 我要使用的情况: flags = …

7
在C ++中将作用域枚举用于位标志
一个enum X : int(C#)或enum class X : int(C ++ 11)是具有一个隐藏的内部场类型int,可容纳任何值。另外,X在枚举上定义了许多预定义的常量。可以将枚举转换为其整数值,反之亦然。在C#和C ++ 11中都是如此。 在C#中,按照Microsoft的建议,枚举不仅用于保存单个值,而且还用于保存标志的按位组合。此类枚举(通常但并非必须)用[Flags]属性修饰。为了简化开发人员的工作,按位运算符(OR,AND等)被重载,因此您可以轻松地执行以下操作(C#): void M(NumericType flags); M(NumericType.Sign | NumericType.ZeroPadding); 我是一位经验丰富的C#开发人员,但是现在仅对C ++进行了几天的编程,并且不了解C ++约定。我打算以与C#中使用的完全相同的方式使用C ++ 11枚举。在C ++ 11中,作用域枚举上的按位运算符没有重载,因此我想重载它们。 这引发了一场辩论,意见似乎在以下三种选择之间有所不同: 枚举类型的变量用于保存位字段,类似于C#: void M(NumericType flags); // With operator overloading: M(NumericType::Sign | NumericType::ZeroPadding); // Without operator overloading: M(static_cast<NumericType>(static_cast<int>(NumericType::Sign) | static_cast<int>(NumericType::ZeroPadding))); 但这会违背C ++ 11范围枚举的强类型枚举哲学。 如果要存储枚举的按位组合,请使用纯整数: void …

13
全面的程序员需要按位操作有多好?[关闭]
最近,我一直在浏览一些OpenJDK代码,并在其中找到了一些与按位操作有关的有趣代码。我什至在StackOverflow上问了一个问题。 另一个例子说明了这一点: 1141 public static int bitCount(int i) { 1142 // HD, Figure 5-2 1143 i = i - ((i >>> 1) & 0x55555555); 1144 i = (i & 0x33333333) + ((i >>> 2) & 0x33333333); 1145 i = (i + (i >>> 4)) & 0x0f0f0f0f; 1146 i = i …

1
为什么将插入号用于XOR而不是求幂?
对于以前曾经遇到过此语法问题的任何人来说,这并不是一个真正的问题,但是我看到使用插入号(^)作为XOR运算代替了广泛接受的数学幂运算而引起的大量混乱。 当然,在很多地方都可以解释和纠正插入符号的(误用)用法,但是对于插入符号为何具有不同的含义,我没有找到任何明确的资料。 是为了方便吗?一次意外?显然,各种语言的推理可能会有所不同,因此任何方面的信息都将很有见地。

11
当我测试C中移位和乘法之间的时间差异时,没有差异。为什么?
有人告诉我,二进制移位比乘以2 ^ k要有效得多。因此,我想尝试一下,并使用以下代码对此进行了测试: #include <time.h> #include <stdio.h> int main() { clock_t launch = clock(); int test = 0x01; int runs; //simple loop that oscillates between int 1 and int 2 for (runs = 0; runs < 100000000; runs++) { // I first compiled + ran it a few times with …

15
位运算符有什么用处?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 编程语言通常带有各种位运算符(例如,按位左移和右移,按位AND,OR,XOR ...)。这些虽然很少使用,但至少我的经验是这样。有时将它们用于编程挑战或面试问题中,或者可能需要解决方案,例如: 不使用任何相等运算符,创建一个函数,true当两个值相等时返回 在不使用第三个变量的情况下,交换两个变量的值 然后这些,可能在现实世界中很少使用。我猜他们应该更快,因为它们直接在低级别上操纵内存。 为什么在大多数编程语言中都可以找到这种语言?任何现实的用例?

6
使用按位运算的优点是什么?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 在阅读了最新的CodeProject时事通讯之后,我发现了有关按位运算的这篇文章。它使阅读有趣,我当然可以看到检查整数是偶数还是奇数的好处,但是测试是否设置了第n位?这样做的好处可能是什么?

2
与std :: bitset相比,c风格的位操作有什么优势吗?
我几乎只在C ++ 11/14中工作,通常在看到这样的代码时会畏缩: std::int64_t mArray; mArray |= someMask << 1; 这只是一个例子。我说的是一般的按位操作。在C ++中,真的有什么意义吗?上面的内容容易引起误解且容易出错,而使用std::bitset可以使您: std::bitset通过调整模板参数并让实现负责其余工作,可以更轻松地根据需要修改的大小,以及 花更少的时间弄清楚正在发生的事情(并可能犯错误),并std::bitset以类似于std::array或其他数据容器的方式编写。 我的问题是;除了向后兼容以外,还有什么理由不使用std::bitset原始类型吗?

4
您最喜欢的按位技术是什么?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 几天前,StackExchange成员Anto询问了按位运算符的有效用法。我说过,移位比将整数除以2的幂更快。StackExchange成员Daemin反驳说,右移带来了负数问题。 那时,我还没有真正考虑过将带符号整数用于移位运算符。我主要在底层软件开发中使用了该技术。因此,我总是使用无符号整数。C对无符号整数执行逻辑移位。执行逻辑右移时,无需注意符号位。空位用零填充。但是,当右移有符号整数时,C执行算术移位运算。空位用符号位填充。此差异导致负值四舍五入为无穷大而不是被舍弃为零,这与有符号整数除法不同。 经过几分钟的思考,得出了第一手的解决方案。该解决方案在移位之前有条件地将负值转换为正值。在执行移位操作后,值将有条件地转换回其负数形式。 int a = -5; int n = 1; int negative = q < 0; a = negative ? -a : a; a >>= n; a = negative ? -a : a; 该解决方案的问题在于,通常将条件赋值语句转换为至少一个跳转指令,并且在不对两个指令路径都进行解码的处理器上,跳转指令可能会非常昂贵。必须两次重新灌注指令流水线才能很好地降低通过分频获得的任何性能提升。 综上所述,我在周六醒来,回答了条件分配问题。我们在执行算术移位运算时遇到的舍入问题仅在使用二进制补码表示形式时发生。它不会以补码表示出现。该问题的解决方案包括在执行移位操作之前将二进制补码值转换为一个二进制补码值。然后,我们必须将一个人的补码值转换回一个两个人的补码值。令人惊讶的是,我们可以执行这组操作,而无需在执行移位操作之前有条件地转换负值。 int a = -5; int n = 1; register int sign …

3
负号如何存储?
我正在观看有关带符号整数的最大值和最小值的视频。 以带正号的示例为例-0000 0001第一位表示数字为正,而最后7位表示数字本身。因此,很容易将其解释为+1。 现在以负符号值-1000 0000为例,结果为-8。好的,计算机可以理解这是一个负值,因为它的第一个比特,但是它如何理解000 0000表示-8? 通常,负符号值如何在计算机中存储/解释?


3
65535号有什么特别之处吗?
2¹⁶-1&2⁵=2⁵(或?显然吗?) 一个开发人员今天问我什么是65535和32,即2¹⁶-1和2⁵=?我起初以为是32,但似乎很容易,然后我想了几分钟,然后回答了32。32似乎是正确的答案,但是如何?65535 =2¹⁶-1= 1111111111111111(但似乎不正确,因为此二进制数全为-1(?)),32 = 100000,但我无法将其转换为头脑,因此无论如何我回答32,因为我有回答一些问题。答案32实际上是微不足道的吗?以同样的方式2¹⁶-1&2⁵-1= 31吗?开发人员为什么要问我有关65535的确切信息? 要求我评估的二进制值是1111111111111111和100000,但我不明白为什么1111111111111111不是-1。不是-1吗?65535是一个产生溢出的数字,我怎么知道?

2
是否可以使用“按位与非”来定义所有按位运算符,类似于仅使用“布尔与非”就可以构建所有布尔逻辑的方法?
Nand 之所以称为“通用”逻辑门,是因为它允许您定义所有其他布尔逻辑门: not(x) = nand(x,x) and(x, y) = not(nand(x, y)) or(x, y) = nand(not(x), not(y)) nor(x, y) = not(or(x, y)) xor(x, y) = nand(nand(a, nand(a, b)), nand(b, nand(a, b))) 这被称为nand-logic,并且在现代计算机中经常使用,因为可以使晶体管的行为类似于nand-gate。 我想知道是否可以对按位运算执行类似的操作。可以在例如逐位NAND(bnand)来定义bnot,bor,band,bnor,bxor?有通用的按位运算吗?

3
<< >>乘法和除法的速度
当我对它们进行计时时,可以使用python中的数字&lt;&lt;进行乘法和&gt;&gt;除法,发现使用二进制移位方法比将常规方法除法或乘法快10倍。 为什么使用&lt;&lt;和&gt;&gt;比*and 要快很多/? 什么是现场处理事情,使落后*和/这么慢?
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.