ser*_*erg 31 math bit-manipulation
根据wiki移位可以用来计算2的幂:
左移算法乘以n相当于乘以2 ^ n(假设该值不溢出),而右移两个补码值的n算术等于除以2 ^ n并向负无穷大舍入.
我总是想,如果任何其他位运算符(~
,|
,&
,^
当应用于基数为10)作出任何数学意义?我理解它们是如何工作的,但是这些操作的结果可以用来计算十进制世界中有用的东西吗?
Blu*_*eft 23
"yep base-10 is what I mean"
在这种情况下,是的,它们可以通过多种方式扩展到base-10,尽管它们不像二进制那样有用.
一种观点认为&
,|
等都是一样的做算术MOD-2到各个二进制数字.如果a
和b
是单个二进制数字,那么
a & b = a * b (mod 2) a ^ b = a + b (mod 2) ~a = 1-a (mod 2) a | b = ~(~a & ~b) = 1 - (1-a)*(1-b) (mod 2)
基数为10的等价物将是(再次注意这些是按位数应用,而不是整数)
a & b = a * b (mod 10) a ^ b = a + b (mod 10) ~a = 9-a (mod 10) a | b = ~(~a & ~b) = 9 - (9-a)*(9-b) (mod 10)
前三设计时使用的电路是有用的BCD(~a
作为9的补数),如非图形计算器,虽然我们只是用*
和+
,而不是&
和^
编写公式的时候.第一个也显然用在一些旧密码中.
Ric*_*ich 15
在没有临时变量的情况下交换两个整数的有趣技巧是使用按位异或:
void swap(int &a, int &b) {
a = a ^ b;
b = b ^ a; //b now = a
a = a ^ b; //knocks out the original a
}
Run Code Online (Sandbox Code Playgroud)
这是因为XOR是可交换的,所以a ^ b ^ b = a.
是的,有其他有用的操作,但他们倾向于涉及权力运作中定向2(原因很明显),对奇/偶,测试2的幂如测试,四舍五入向上/向下的最近的电源2等.
参见Henry S. Warren的Hacker's Delight.
在我使用的每种语言中(诚然,几乎只有C和C衍生语),按位运算符只是整数运算(当然,除非你重写操作).
虽然你可以旋转一个十进制数的位(毕竟它们有自己的位),但它不一定能得到与twiddling整数位相同的结果.有关十进制数位的说明,请参见单精度和双精度.有关使用十进制数位的有利用法的示例,请参见快速反向平方根.
编辑
对于整数,按位运算总是有意义的.按位运算是为整数设计的.
n << 1 == n * 2
n << 2 == n * 4
n << 3 == n * 8
n >> 1 == n / 2
n >> 2 == n / 4
n >> 3 == n / 8
n & 1 == {0, 1} // Set containing 0 and 1
n & 2 == {0, 2} // Set containing 0 and 2
n & 3 == {0, 1, 2, 3} // Set containing 0, 1, 2, and 3
n | 1 == {1, n, n+1}
n | 2 == {2, n, n+2}
n | 3 == {3, n, n+1, n+2, n+3}
Run Code Online (Sandbox Code Playgroud)
等等.