Bitwise String Operators

Bitwise String Operators

Bitstrings of any size may be manipulated by the bitwise operators (~ | & ^).

If the operands to a binary bitwise op are strings of different sizes, | and ^ ops act as though the shorter operand had additional zero bits on the right, while the & op acts as though the longer operand were truncated to the length of the shorter. The granularity for such extension or truncation is one or more bytes.

# ASCII-based examples
print "j p \n" ^ " a h";        	# prints "JAPH\n"
print "JA" | "  ph\n";          	# prints "japh\n"
print "japh\nJunk" & '_____';   	# prints "JAPH\n";
print 'p N$' ^ " E<H\n";		# prints "Perl\n";

If you are intending to manipulate bitstrings, be certain that you're supplying bitstrings: If an operand is a number, that will imply a numeric bitwise operation. You may explicitly show which type of operation you intend by using "" or 0+ , as in the examples below.

$foo =  150  |  105;	# yields 255  (0x96 | 0x69 is 0xFF)
$foo = '150' |  105;	# yields 255
$foo =  150  | '105';	# yields 255
$foo = '150' | '105';	# yields string '155' (under ASCII)

$baz = 0+$foo & 0+$bar;	# both ops explicitly numeric
$biz = "$foo" ^ "$bar";	# both ops explicitly stringy

This somewhat unpredictable behavior can be avoided with the experimental "bitwise" feature, new in Perl 5.22. You can enable it via use feature 'bitwise' . By default, it will warn unless the "experimental::bitwise" warnings category has been disabled. (use experimental 'bitwise' will enable the feature and disable the warning.) Under this feature, the four standard bitwise operators (~ | & ^) are always numeric. Adding a dot after each operator (~. |. &. ^. ) forces it to treat its operands as strings:

use experimental "bitwise";
$foo =  150  |  105;	# yields 255  (0x96 | 0x69 is 0xFF)
$foo = '150' |  105;	# yields 255
$foo =  150  | '105';	# yields 255
$foo = '150' | '105';	# yields 255
$foo =  150  |. 105;	# yields string '155'
$foo = '150' |. 105;	# yields string '155'
$foo =  150  |.'105';	# yields string '155'
$foo = '150' |.'105';	# yields string '155'

$baz = $foo &  $bar;	# both operands numeric
$biz = $foo ^. $bar;	# both operands stringy

The assignment variants of these operators (&= |= ^= &.= |.= ^.= ) behave likewise under the feature.

The behavior of these operators is problematic (and subject to change) if either or both of the strings are encoded in UTF-8 (see Byte and Character Semantics in perlunicode.

See vec for information on how to manipulate individual bits in a bit vector.

doc_perl
2016-12-06 03:18:25
Comments
Leave a Comment

Please login to continue.