32 lines
1.1 KiB
Text
32 lines
1.1 KiB
Text
include "bitwise" {search: "."}; # adjust as required
|
|
|
|
def leftshift($n; $width):
|
|
[(range(0,$n)| 0), limit($width - $n; bitwise)][:$width] | to_int;
|
|
|
|
# Using a width of $width bits: x << n | x >> ($width-n)
|
|
def rotateLeft($x; $n; $width):
|
|
$x | bitwise_or(leftshift($n; $width); rightshift($width-$n));
|
|
|
|
# Using a width of $width bits: x << n | x >> ($width-n)
|
|
def rotateRight($x; $n; $width):
|
|
$x | bitwise_or(rightshift($n); leftshift($width-$n; $width) );
|
|
|
|
def task($x; $y):
|
|
def isInteger: type == "number" and . == round;
|
|
if ($x|isInteger|not) or ($y|isInteger|not) or
|
|
$x < 0 or $y < 0 or $x > 4294967295 or $y > 4294967295
|
|
then "Operands must be in the range of a 32-bit unsigned integer" | error
|
|
else
|
|
" x = \($x)",
|
|
" y = \($y)",
|
|
" x & y = \(bitwise_and($x; $y))",
|
|
" x | y = \(bitwise_or($x; $y))",
|
|
" x ^ y = \(null | xor(x; $y))",
|
|
"~x = \(32 | flip($x))",
|
|
" x << y = \($x | leftshift($y))",
|
|
" x >> y = \($x | rightshift($y))",
|
|
" x rl y = \(rotateLeft($x; $y; 32))",
|
|
" x rr y = \(rotateRight($x; $y; 32))"
|
|
end;
|
|
|
|
task(10; 2)
|