
Basic Data Operation

This is a basic data operation. It represents a fundamental action on a basic data type.
You may see other such operations in the Basic Data Operations category, or:


Integer Operations
Arithmetic |
Comparison
Boolean Operations
Bitwise |
Logical
String Operations
Concatenation |
Interpolation |
Comparison |
Matching
Memory Operations
Pointers & references |
Addresses


Task

Write a function that takes two logical (boolean) values, and outputs the result of "and" and "or" on both arguments as well as "not" on the first arguments.

If the programming language doesn't provide a separate type for logical values, use the type most commonly used for that purpose.

If the language supports additional logical operations on booleans such as XOR, list them as well.




invocable all
 
procedure main()                      #: sample demonstrating boolean function use
 
limit := 4
char2 := char(2)||char(0)
every (i := char(1 to limit)|char2) do {
   write(iop := "bnot","( ",image(i)," ) = ",image(iop(i)))
   every k := 3 | 10 do {
     write("bistrue(",image(i),",",k,") - ", if bistrue(i,k) then "returns" else "fails")
     write("bisfalse(",image(i),",",k,") - ", if bisfalse(i,k) then "returns" else "fails")
     }
   every (j := char(1 to limit)) & (iop := "bor"|"band"|"bxor") do 
      write(iop,"( ",image(i),", ",image(j)," ) = ",image(iop(i,j)))
   }
end
 
 
procedure bisfalse(b,p)                #: test if bit p (numbered right to left from 1) is false; return b or fails
return boolean_testbit(0,b,p)
end
 
procedure bistrue(b,p)                 #: test if bit p is true; return b or fails
return boolean_testbit(1,b,p)
end
 
procedure bnot(b)                      #: logical complement of b (not is a reserved word)
static cs,sc
initial sc := reverse(cs := string(&cset))
if type(b) ~== "string" then runerr(103,b)
return map(b,cs,sc)                    # en-mass inversion through remapping ordered cset
end
 
procedure bor(b1,b2)                   #: logical or
return boolean_op(ior,b1,b2)
end
 
procedure band(b1,b2)                  #: logical or
return boolean_op(iand,b1,b2)
end
 
procedure bxor(b1,b2)                  #: logical or
return boolean_op(ixor,b1,b2)
end
 
procedure boolean_testbit(v,b,p)       #: (internal) test if bit p is true/false; return b or fail
if not 0 <= integer(p) = p then runerr(101,p)
if type(b) ~== "string" then runerr(103,b)
if v = ishift(ord(b[-p/8-1]), -(p%8)+1) then return b
end
 
procedure boolean_op(iop,b1,b2)        #: boolean helper 
local b3,i
static z
initial z := char(0)
if type(b1) ~== "string" then runerr(103,b1)
if type(b2) ~== "string" then runerr(103,b2)
b3 := ""
every i := -1 to -max(*b1,*b2) by -1 do 
   b3 :=  char(iop(ord(b1[i]|z),ord(b2[i]|z))) || b3
return b3
end