Alb*_*ore 18 c c++ math addition bitwise-operators
假设我有四个32位数字,定义为它们的位不重叠,即
unsigned long int num0 = 0xFF000000;
unsigned long int num1 = 0x00FF0000;
unsigned long int num2 = 0x0000FF00;
unsigned long int num3 = 0x000000FF;
Run Code Online (Sandbox Code Playgroud)
每个号码中的哪个位置可以代替FF
s.
我是否正确地说添加和按位或者总是会为这种数字产生相同的输出?
谢谢!
And*_*tin 32
只要适用两个数字num1和num2 num1 & num2 == 0
,则遵循:
num1 + num2 == num1 | num2
原因是,该加法基本上是一个按位XOR,加上进位.但是只要没有进位(num1 & num2 == 0
),那么加法归结为按位异或,num1 & num2 == 0
在这种情况下(再次因为)在逻辑上等效于按位OR
是的,as(按位查看)0+1
与 相同0|1
。唯一的区别是1|1 (=1)
vs. 1+1(=0b10)
,即创建一个 0 并发生溢出,影响左侧的位)。
所以在你的情况下两者是等价的。但为了安全起见,你应该选择不易出错的。
不:
num3 + num3 => 0x000001FE
num3 | num3 => 0x000000FF
Run Code Online (Sandbox Code Playgroud)
当然,只要您确保仅将您知道它们没有相同位集的东西添加在一起,您应该是安全的。