在这种情况下,'addition'和'bitwise or'是一样的吗?
Are 'addition' and 'bitwise or' the same in this case?
假设我有四个32位数字,定义为它们的位不重叠,即
unsigned long int num0 = 0xFF000000;
unsigned long int num1 = 0x00FF0000;
unsigned long int num2 = 0x0000FF00;
unsigned long int num3 = 0x000000FF;
在每个数字中可以有任何东西来代替FF
s
我说将和按位相加或对这类数字总是产生相同的输出,对吗?
谢谢!
只要两个数num1和num2应用num1 & num2 == 0
,则如下:
num1 + num2 == num1 | num2
这样做的原因是,加法基本上是一个按位异或,加上进位。但是只要没有进位(num1 & num2 == 0
),那么加法归结为位异或,在这种情况下(再次因为num1 & num2 == 0
)在逻辑上相当于位或
是的,因为(按位来看)0+1
与0|1
相同。唯一的区别是1|1 (=1)
和1+1(=0b10)
,即创建一个0和溢出,影响到左边的位)。
所以在你的例子中两者是等价的。但是你应该为安全起见,选择不容易出错的版本
No:
num3 + num3 => 0x000001FE
num3 | num3 => 0x000000FF
当然,只要您确保只在您知道它们没有相同位设置的情况下将它们加在一起,就应该是安全的。
只要你不做num3 + num3
这样的事情,是的。
每当按位加法加一个以上的1(要么是因为源中有1,要么从另一个地方进位也是1),则产生进位,并且一个位置影响另一个位置。只要加法中最多加一个1,就和按位或一样。
当我们观察加法器电路(http://en.wikipedia.org/wiki/Adder_%28electronics%29)时也可以看到这一点,当不产生进位时,电路中参与的所有元素都是"或"元素。
加法和按位运算或将与按位运算相同,或将包括其中的任何位,并且考虑到您的位的互斥性质,普通加法将完全相同。
相关文章:
- 瓦尔格林德:数学函数"Conditional jump or move depends on uninitialised value(s)"
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 为什么在C++中对链表这样做?(像堆叠一样处理它们)
- 堆栈和队列是否像C++中的数组一样传递?
- Android NDK clang 编译器错误在 Windows 上显示'No such file or directory'
- 是否有技术原因阻止 Java 中的 final C++ 像 const 一样严格?
- 模式"allocate memory or use existing data"
- N-API include an .so or dll
- 访问数据成员(本身是对象)的数据成员,就好像它们是类成员一样
- 已解决 - C++ 的崇高文本中的"fatal error: opencv: no such file or directory"
- 将 OR 逻辑运算符从 C++ 转换为 Fortran
- CPP 中的瓦尔格林德和记忆泄漏:"Conditional jump or move depends on uninitialised values"
- 我们可以将集合的值存储在变量中吗?就像我们可以将数组的值存储在变量中一样
- 我如何在C++像在 Python 中一样实现 f 字符串?
- 我如何将 OR 与 if 语句一起使用字符串
- 自制的上衣:看起来一样,但不完全相同
- 如何使用 redis-plus-plus 存储二进制数据,就像我想存储结构一样?@for_stack?
- 在这种情况下,'addition'和'bitwise or'是一样的吗?