如您所知,计算机中的数据以二进制格式表示。
例如,如果您有整数 13,则它表示为 1101b(其中 b 表示二进制)。这适用于(1) * 8 + (1) * 4 + (0) * 2 + (1) * 1 = 13,就像(1) * 10 + (3) * 1 = 13——不同的基础。
但是,对于基本操作,计算机需要知道您正在处理多少数据。典型的整数大小是 32 位。所以它不仅仅是1101b,它是00000000000000000000000000001101b——32位,其中大部分未使用。
按位操作就是这样——它们只在位级别上操作。加法、乘法和其他操作一次考虑多个位来执行它们的功能,但按位运算符不考虑。例如:
12 位加 7 是什么? (C语言,12 & 7)
1010b 12 &
0111b 7
----- =
0010n 2
为什么?垂直思考!看看左边的一组数字——1和0是0。然后,0和1是0。然后,1和1是1。最后,0和1是0。
这是基于陈述这些规则的 and 真值表——只有真(又名 1)和真(又名 1)才会导致假(又名 0)。所有其他结果值都是假的(又名 0)。
同样,or 真值表表明所有结果都是真(又名 1),但假(又名 0)和假(又名 0)导致假(又名 0)。
让我们做同样的例子,但这次让我们计算 12 按位或 7。(或者在 C 语言中,12 | 7)
1010b 12 |
0111b 7
----- =
1111n 15
最后,让我们考虑另一个主要的位运算符:不是。这是一个一元运算符,您只需翻转每一位。让我们按位计算而不是 7(或用 C 语言,~7)
0111b ~7
----- =
1000b 8
但是等等……那些前导零呢?嗯,是的,在我因为它们不重要而忽略它们之前,但现在它们肯定是:
00000000000000000000000000000111b ~7
--------------------------------- =
11111111111111111111111111111000b ... big number?
如果您指示计算机将结果视为无符号整数(32 位),那么这是一个非常大的数字。 (略少于 40 亿)。如果您指示计算机将结果视为有符号整数(32 位),则为 -8。
正如您可能已经猜到的那样,由于所有这些操作的逻辑非常简单,因此您无法单独使它们更快。但是,按位运算遵循与布尔逻辑相同的逻辑,因此您可以使用布尔逻辑缩减技术来减少您可能需要的按位运算的数量。
例如(A & B) | (A & C) 结果与A & (B | C) 相同
但是,这是一个更大的话题。卡诺图是一种技术,但boolean algebra 通常是我在编程时最终使用的。