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 = 0
0 and 1 = 0
1 and 0 = 0
1 and 1 = 1
例如,让我们在十进制 15 和 25 之间进行 AND
运算。15 和 25 的与输出是二进制 01001
,即十进制 9。
15 = 01111
25 = 11001
15 and 25 = 01001
OR
(或)
要使 OR
输出为 1,任一位都应为 1。
0 or 0 = 0
0 or 1 = 1
1 or 0 = 1
1 or 1 = 1
例如,我们将十进制的 15 和 25 进行或运算。15 和 25 的或输出是二进制的 11111
,即十进制的 31。
15 = 01111
25 = 11001
15 or 25 = 11111
XOR
(异或)
要使 XOR
输出为 1,只需其中一位为 1。当两位都为 1 时,异或将返回 0。
0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0
例如,我们对十进制的 15 和 25 进行异或。 15 和 25 的异或输出是二进制的 10110
,也就是十进制的 22。
15 = 01111
25 = 11001
15 xor 25 = 10110
Complement
(补码)
补码使 0 变为 1,1 变为 0。
例如,我们对十进制 15 求补。
15 = 01111
15 compl = 10000
Left Shift
(左移)
该函数将位移至左侧; 您可以指定它应该进行移动的次数。 0 从右侧移入。
例如,让我们左移(两次)十进制 15。 15 左移两次输出是二进制 111100
,即十进制 60。
15 = 1111
lshift 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