95. 位操作


就像 C 一样,awk 可以操作位。您在日常 awk 编程中可能不需要这个。但是,这表明您可以使用 awk 程序做多少事情。

下表显示了一位十进制数及其等效的二进制数。

十进制 二进制
2 10
3 11
4 100
5 101
6 110
7 111
8 1000
9 1001

要使 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 输出为 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 输出为 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

补码使 0 变为 1,1 变为 0。

例如,我们对十进制 15 求补。

  • 15 = 01111
  • 15 compl = 10000

该函数将位移至左侧; 您可以指定它应该进行移动的次数。 0 从右侧移入。

例如,让我们左移(两次)十进制 15。 15 左移两次输出是二进制 111100,即十进制 60。

  • 15 = 1111
  • lshift twice = 111100

该函数将位移至右侧; 您可以指定它应该进行移动的次数。 0 从左侧移入。

例如,让我们右移(两次)十进制 15。 15 左移两次输出是二进制 0011,即十进制 3。

  • 15 = 1111
  • lshift twice = 0011
$ 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