awk

Bit Manipulation

就像C, AWK可以操纵位。你可能不会在你的日常AWK编程需要这个。但是,这正好说明多少,你可以用awk程序做到。

下表显示了十进制个位数,与之等效二进制数。

Decimal Binary
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。与输出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

异或输出为1,仅由一个位应为1。当两个位都为1 ,异或将返回0 。

0 xor 0=0
0 xor 1=1
1 xor 0=1
1 xor 1=0

例如,让我们做异或十进制15和25,异或输出是二进制10110 ,即十进制数22 。

15 =01111
25 =11001
15 xor 25 = 10110

Complement

Complement使0作为1 ,1为0 。

例如,让我们complement数字15.

15 =01111
15 compl = 10000

Left Shift

此函数将这个位移到左侧;你可以指定它应该有多少次移位。 0从右侧移入。

例如,让我们左移(两次)数字15. LSHIFT两次总产量的15为二进制111100 ,这是60(十进制) 。

15 = 1111
lshift twice = 111100

Right Shift

此函数位移到右侧;你可以指定它应该有多少次移位。 0从左侧移入。

例如,让我们右移(两次)十进制15,15的LSHIFT两次输出是二进制的0011 ,它是数字3。

15 = 1111
lshift twice = 0011

Awk Example using Bit Functions

$ 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(number2,2)
}


$ awk -f bits.awk
AND: 9
OR: 31
XOR: 22
LSHIFT: 60
RSHIFT: 6