sal*_*nso 7 linux windows perl bit-manipulation xor
由于某种原因需要很长时间解释,我想在 perl 中执行以下按位运算:\n(假设 1 表示 true,0 表示 false)
\n$var1="11000001";\n$var2="10000101";\n\n$y=$var1 & $var2; #bitwise and\n$o=$var1 | $var2; #bitwise or\nprint "var1 & var2: $y\\n";\nprint "var1 | var2: $o\\n";\nRun Code Online (Sandbox Code Playgroud)\n然后,我在 Windows Perl 和 Linux Perl 中得到相同的输出:
\nvar1 & var2: 10000001 (which is what I wished)\nvar1 | var2: 11000101 (which is what I wished)\nRun Code Online (Sandbox Code Playgroud)\n但如果我这样做:
\n$xox=$var1^$var2; # bitwise xor\nprint "var1 ^ var2: $xox\\n";\nRun Code Online (Sandbox Code Playgroud)\n那么windows中的输出是:
\nvar1 ^ var2: \xe2\x98\xba \xe2\x98\xba\nRun Code Online (Sandbox Code Playgroud)\n而在linux中是:
\nvar1 ^ var2: \nRun Code Online (Sandbox Code Playgroud)\n鉴于 & 和 | 运算符似乎按“预期”工作,我也期望得到类似的结果:
\n$var1="11000001";\n$var2="10000101";\n$xox=$var1^$var2; # bitwise xor\nprint "var1 ^ var2 --> $xox\\n";\nRun Code Online (Sandbox Code Playgroud)\nvar1 ^ var2 --> 01000100
\n对于 ^ 运算符。
\n但是,如上所示,Windows 和 Linux 的情况并非如此,尽管至少 Windows 的 xor 输出对我的目的有用,但 Linux 的输出则不然。
\n任何人都可以解释为什么“&”或“|” 运算符似乎有效,但 '^' (XOR) 运算符无效?\n为什么 Linux 和 Windows 之间存在这种差异?\n谢谢
\n注意:指定 int($var1) ^ int($var2) 不会产生理想的结果(对我来说;即得到输出 01000100)
\nhar*_*old 10
\n\n任何人都可以解释为什么“&”或“|” 运算符似乎有效,但“^”(XOR)运算符不起作用?
\n
根据 0 和 1 字符的字符代码,这或多或少是巧合&:|
0x30 | 0x31 = 0x31 (observed: "0" | "1" = "1")\n0x30 & 0x31 = 0x30 (observed: "0" & "1" = "0")\nRun Code Online (Sandbox Code Playgroud)\n和&都|保留了高半字节中的 3,而 0 和 1 字符的低半字节恰好分别为 0 和 1。
XOR 将顶部半字节中的 3 清零,因此您会得到一些无意义的字符,这些字符根据操作系统解释它们的方式而有所不同。显然,至少在某些情况下,值为 1 的字符(只是 1,而不是 0x31,通常它是不可打印的字符)在 Windows 上显示为 \xe2\x98\xba 。
\n作为一个快速技巧,您可以这样做将 3 放回顶部半字节中:
\n$xox=($var1^$var2)|"00000000"; # bitwise xor\nRun Code Online (Sandbox Code Playgroud)\n我认为这是一个黑客行为。
\n\n\n注意:指定 int($var1) ^ int($var2) 不会产生理想的结果(对我来说;即得到输出 01000100)
\n
因为您没有指定这些是二进制数字,所以它们没有按预期进行解析。这是一种方法,请注意,这种方式不会保留前导零:
\nprint sprintf("%b", oct("0b$var1") ^ oct("0b$var2"));\nRun Code Online (Sandbox Code Playgroud)\n