type
bitnum = 0..63;
set64 = set of bitnum;
function BT(x: uint64; n: bitnum): boolean;
var
tempset: set64 absolute x;
begin
BT := n in tempset
end;
function BTS(var x: uint64; n: bitnum): boolean;
var
tempset: set64 absolute x;
begin
BTS := n in tempset;
tempset := tempset + [1 shl n]
end;
function BTR(var x: uint64; n: bitnum): boolean;
var
tempset: set64 absolute x;
begin
BTR := n in tempset;
tempset := tempset - [1 shl n]
end;
function BTC(var x: uint64; n: bitnum): boolean;
var
tempset: set64 absolute x;
begin
BTC := n in tempset;
tempset := tempset >< [1 shl n]
end;
function BSR(x: uint64): bitnum;
var
tempset: set64 absolute x;
i: bitnum;
begin
for i in tempset do
begin
BSR := i;
break;
end;
end;
function BSF(x: uint64): bitnum;
var
tempset: set64 absolute x;
i: bitnum;
begin
for i in tempset do
begin
BSF := i;
end;
end;
begin
Writeln('Bit N ', 3, ' in ', 10, ' is ', BT(10, 3));
Writeln('Bit N ', 3, ' in ', 7, ' is ', BT(7, 3));
Writeln('Lowest bit in ', 12, ' is ', BSR(12));
Writeln('Lowest bit in ', 7, ' is ', BSR(7));
Writeln('Highest bit in ', 12, ' is ', BSF(12));
Writeln('Highest bit in ', 7, ' is ', BSF(7));
end.
dHlwZQogIGJpdG51bSA9IDAuLjYzOwogIHNldDY0ID0gc2V0IG9mIGJpdG51bTsKCmZ1bmN0aW9uIEJUKHg6IHVpbnQ2NDsgbjogYml0bnVtKTogYm9vbGVhbjsKdmFyCiAgdGVtcHNldDogc2V0NjQgYWJzb2x1dGUgeDsKYmVnaW4KICBCVCA6PSBuIGluIHRlbXBzZXQKZW5kOwoKZnVuY3Rpb24gQlRTKHZhciB4OiB1aW50NjQ7IG46IGJpdG51bSk6IGJvb2xlYW47CnZhcgogIHRlbXBzZXQ6IHNldDY0IGFic29sdXRlIHg7CmJlZ2luCiAgQlRTIDo9IG4gaW4gdGVtcHNldDsKICB0ZW1wc2V0IDo9IHRlbXBzZXQgKyBbMSBzaGwgbl0KZW5kOwoKZnVuY3Rpb24gQlRSKHZhciB4OiB1aW50NjQ7IG46IGJpdG51bSk6IGJvb2xlYW47CnZhcgogIHRlbXBzZXQ6IHNldDY0IGFic29sdXRlIHg7CmJlZ2luCiAgQlRSIDo9IG4gaW4gdGVtcHNldDsKICB0ZW1wc2V0IDo9IHRlbXBzZXQgLSBbMSBzaGwgbl0KZW5kOwoKZnVuY3Rpb24gQlRDKHZhciB4OiB1aW50NjQ7IG46IGJpdG51bSk6IGJvb2xlYW47CnZhcgogIHRlbXBzZXQ6IHNldDY0IGFic29sdXRlIHg7CmJlZ2luCiAgQlRDIDo9IG4gaW4gdGVtcHNldDsKICB0ZW1wc2V0IDo9IHRlbXBzZXQgPjwgWzEgc2hsIG5dCmVuZDsKCmZ1bmN0aW9uIEJTUih4OiB1aW50NjQpOiBiaXRudW07CnZhcgogIHRlbXBzZXQ6IHNldDY0IGFic29sdXRlIHg7CiAgaTogYml0bnVtOwpiZWdpbgogIGZvciBpIGluIHRlbXBzZXQgZG8KICAgIGJlZ2luCiAgICAgIEJTUiA6PSBpOwogICAgICBicmVhazsKICAgIGVuZDsKZW5kOwoKZnVuY3Rpb24gQlNGKHg6IHVpbnQ2NCk6IGJpdG51bTsKdmFyCiAgdGVtcHNldDogc2V0NjQgYWJzb2x1dGUgeDsKICBpOiBiaXRudW07CmJlZ2luCiAgZm9yIGkgaW4gdGVtcHNldCBkbwogICAgYmVnaW4KICAgICAgQlNGIDo9IGk7CiAgICBlbmQ7CmVuZDsKCmJlZ2luCgpXcml0ZWxuKCdCaXQgTiAnLCAzLCAnIGluICcsIDEwLCAnIGlzICcsIEJUKDEwLCAzKSk7CldyaXRlbG4oJ0JpdCBOICcsIDMsICcgaW4gJywgNywgJyBpcyAnLCBCVCg3LCAzKSk7CgpXcml0ZWxuKCdMb3dlc3QgYml0IGluICcsIDEyLCAnIGlzICcsIEJTUigxMikpOwpXcml0ZWxuKCdMb3dlc3QgYml0IGluICcsIDcsICcgaXMgJywgQlNSKDcpKTsKV3JpdGVsbignSGlnaGVzdCBiaXQgaW4gJywgMTIsICcgaXMgJywgQlNGKDEyKSk7CldyaXRlbG4oJ0hpZ2hlc3QgYml0IGluICcsIDcsICcgaXMgJywgQlNGKDcpKTsKZW5kLgo=