按位运算符(除了移位)在基数10中是否具有任何数学意义?

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到各个二进制数字.如果ab是单个二进制数字,那么

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的补数),如非图形计算器,虽然我们只是用*+,而不是&^编写公式的时候.第一个也显然用在一些旧密码中.

  • 或者,您也可以查看&作为最小值,| 作为最大值和〜再次作为补充.在数学上,这给你一个格子而不是一个环. (3认同)

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.

  • @SamDufel:实际上它只会交换任何东西的按位表示。任何包含内部指针的结构(即数据结构的一部分指向另一部分,例如在字符串类型的短字符串优化中)都会中断,因为现在指针将指向 *other* 对象。 (3认同)
  • @SamDufel:我的意思是你声称“它可以让你交换任何东西”是错误的。 (2认同)
  • 我相信你错了,但我不认为关于什么构成"交换"的迂腐论证会增加这个答案的价值. (2认同)

Pau*_*l R 6

是的,有其他有用的操作,但他们倾向于涉及权力运作中定向2(原因很明显),对奇/偶,测试2的幂如测试,四舍五入向上/向下的最近的电源2等.

参见Henry S. Warren的Hacker's Delight.

  • +1因为Hacker's Delight令人难以置信. (3认同)

Bri*_*n S 6

在我使用的每种语言中(诚然,几乎只有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)

等等.