95. 位操作
就像 C 一样,awk 可以操作位。您在日常 awk 编程中可能不需要这个。但是,这表明您可以使用 awk 程序做多少事情。
下表显示了一位十进制数及其等效的二进制数。
| 十进制 | 二进制 |
|---|---|
2 |
10 |
3 |
11 |
4 |
100 |
5 |
101 |
6 |
110 |
7 |
111 |
8 |
1000 |
9 |
1001 |
AND(与)
要使 AND 输出为 1,两个位都应为 1。
0 and 0 = 00 and 1 = 01 and 0 = 01 and 1 = 1
例如,让我们在十进制 15 和 25 之间进行 AND 运算。15 和 25 的与输出是二进制 01001,即十进制 9。
15 = 0111125 = 1100115 and 25 = 01001
OR(或)
要使 OR 输出为 1,任一位都应为 1。
0 or 0 = 00 or 1 = 11 or 0 = 11 or 1 = 1
例如,我们将十进制的 15 和 25 进行或运算。15 和 25 的或输出是二进制的 11111,即十进制的 31。
15 = 0111125 = 1100115 or 25 = 11111
XOR(异或)
要使 XOR 输出为 1,只需其中一位为 1。当两位都为 1 时,异或将返回 0。
0 xor 0 = 00 xor 1 = 11 xor 0 = 11 xor 1 = 0
例如,我们对十进制的 15 和 25 进行异或。 15 和 25 的异或输出是二进制的 10110,也就是十进制的 22。
15 = 0111125 = 1100115 xor 25 = 10110
Complement(补码)
补码使 0 变为 1,1 变为 0。
例如,我们对十进制 15 求补。
15 = 0111115 compl = 10000
Left Shift (左移)
该函数将位移至左侧; 您可以指定它应该进行移动的次数。 0 从右侧移入。
例如,让我们左移(两次)十进制 15。 15 左移两次输出是二进制 111100,即十进制 60。
15 = 1111lshift twice = 111100
Right Shift (右移)
该函数将位移至右侧; 您可以指定它应该进行移动的次数。 0 从左侧移入。
例如,让我们右移(两次)十进制 15。 15 左移两次输出是二进制 0011,即十进制 3。
- 15 = 1111
- lshift twice = 0011
使用位函数的 awk 示例
$ cat bits.awk
BEGIN {
number1=15
number2=25
print "AND: " and(number1,number2);
print "OR: " or(number1,number2)
print "XOR: " xor(number1,number2)
print "LSHIFT: " lshift(number1,2)
print "RSHIFT: " rshift(number1,2)
}
$ awk -f bits.awk
AND: 9
OR: 31
XOR: 22
LSHIFT: 60
RSHIFT: 3