为什么我可以按位或两个字符串,就好像它们是二进制数一样?

Why can I bitwise OR two strings as if they were binary numbers?

我正在尝试编写一个 Perl 程序,它将两个表示二进制数的字符串(即仅由字符“1”和“0”组成)作为输入,并打印出两个数字按位或运算的结果一起(也以二进制形式打印结果)。

在这样做的过程中,我创建了以下程序来执行此操作,但我很难理解它的确切原因:

my $a = "1000100101101";
my $b = "0100111000101";
print($a | $b); # prints "1100111101101"

我知道 perl 在类似数字的上下文中使用时会自动将字符串转换为数字,但它总是将此类字符串转换为以 10 为基数的数字。

为什么这个程序看似对两个二进制数字串执行按位或运算?

使用bitwise功能时,

  • | 取两个数字并计算它们的按位或。 (字符串被数字化。)

  • |. 获取两个字符串并计算每个索引处字符的按位或。 (数字被字符串化。)

如果没有 bitwise 特性,Perl 会根据操作数的类型猜测对 | 执行上述哪一项操作。

您显然没有使用 bitwise 功能。通过提供两个字符串,您最终对在每个索引处找到的字符执行 OR。

|& 将适用于二进制(如果字符串长度相同),但不适用于 ^.

a          b          a|b        a&b        a^b
0x30("0")  0x30("0")  0x30("0")  0x30("0")  0x00("\x00")
0x30("0")  0x31("1")  0x31("1")  0x30("0")  0x01("\x01")
0x31("1")  0x30("0")  0x31("1")  0x30("0")  0x01("\x01")
0x31("1")  0x31("1")  0x31("1")  0x31("0")  0x00("\x00")

“0”和“1”的 ASCII 码分别是数字 48 和 49。这些的二进制表示是 0011_0000 和 0011_0001,这恰好是 OR 正确的。可能是巧合,甚至可能是 ASCII 委员会那样设计的。不知道。

大写字母'A'和space、0100_0001和0010_0000进行OR运算,结果为0110_0001,即小写'a',符合预期。