(phixonline)-->
-- demo\rosetta\Bitwise_operations.exw
with javascript_semantics
enum SHL, SAR, SHR, ROL, ROR
function bitop(atom a, integer b, integer op)
atom res
if op=SHL then
-- Note: Phix doesn't quietly discard high bits...
res = and_bitsu(a << b,#FFFF_FFFF)
elsif op=SAR then
-- Note: Phix doesn't really do "unsigned numbers",
-- Should you want to treat 4G-1 as -1 then:
if a>#7FFF_FFFF then a -= #1_0000_0000 end if
res = and_bitsu(a >> b,#FFFF_FFFF)
elsif op=SHR then
res = and_bitsu(a >> b,#FFFF_FFFF)
elsif op=ROL then
return or_bitsu(a >> 32-b, and_bits(a << b,#FFFF_FFFF))
elsif op=ROR then
return or_bitsu(a >> b, and_bits(a << 32-b,#FFFF_FFFF))
else
?9/0
end if
return res
end function
procedure bitwise(atom a, atom b)
printf(1,"and_bits(%b,%b) = %032b\n",{a,b,and_bitsu(a,b)})
printf(1," or_bits(%b,%b) = %032b\n",{a,b, or_bitsu(a,b)})
printf(1,"xor_bits(%b,%b) = %032b\n",{a,b,xor_bitsu(a,b)})
printf(1,"not_bits(%b) = %032b\n",{a,not_bitsu(a)})
printf(1," shl(%b,%b) = %032b\n",{a,b,bitop(a,b,SHL)})
printf(1," sar(%b,%b) = %032b\n",{a,b,bitop(a,b,SAR)})
printf(1," shr(%b,%b) = %032b\n",{a,b,bitop(a,b,SHR)})
printf(1," rol(%b,%b) = %032b\n",{a,b,bitop(a,b,ROL)})
printf(1," ror(%b,%b) = %032b\n",{a,b,bitop(a,b,ROR)})
end procedure
bitwise(0x800000FE,7)