为什么我可以按位或两个字符串,就好像它们是二进制数一样?
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',符合预期。
我正在尝试编写一个 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',符合预期。