
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 routine to perform a bitwise AND, OR, and XOR on two integers, a bitwise NOT on the first integer, a left shift, right shift, right arithmetic shift, left rotate, and right rotate.

All shifts and rotates should be done on the first integer with a shift/rotate amount of the second integer.

If any operation is not available in your language, note it.




main:(
 
  PRIO SLC = 8, SRC = 8; # SLC and SRC are not built in, define and overload them here #
  OP SLC = (BITS b, INT rotate) BITS: b SHL rotate OR b SHR ( bits width - rotate );
  OP SRC = (BITS b, INT rotate) BITS: b SHR rotate OR b SHL ( bits width - rotate );
  # SRC and SRL are non-standard, but versions are built in to ALGOL 68R's standard prelude #
 
  PRIO XOR = 2;
  OP XOR = (BITS p, q) BITS: p AND NOT q OR NOT p AND q;
  # XOR is non-standard, but a version is built in to ALGOL 68G's standard prelude #
 
  # ALGOL 68 has 5 different ways of representing a BINary BITS - Bases: 2, 4, 8, 16 and flip/flop #
  FORMAT b5 = $"2r"2r32d," 4r"4r16d," 8r"8r11d," 16r"16r8d," "gl$;
  OP BBBBB = (BITS b)[]BITS: (b,b,b,b,b);
 
  PROC bitwise = (BITS a, BITS b, INT shift)VOID:
  (
    printf((
      $"         bits shorths: "gxgl$, bits shorths, "1 plus the number of extra SHORT BITS types",
      $"         bits lengths: "gxgl$, bits lengths, "1 plus the number of extra LONG BITS types",
      $"             max bits: "gl$, max bits,
      $"        long max bits: "gl$, long max bits,
      $"   long long max bits: "gl$, long long max bits,
      $"           bits width: "gxgl$, bits width, "The number of CHAR required to display BITS",
      $"      long bits width: "gxgl$, long bits width, "The number of CHAR required to display LONG BITS",
      $" long long bits width: "gxgl$, long long bits width, "The number of CHAR required to display LONG LONG BITS",
      $"         bytes shorths: "gxgl$, bytes shorths, "1 plus the number of extra SHORT BYTES types",
      $"         bytes lengths: "gxgl$, bits lengths, "1 plus the number of extra LONG BYTES types",
      $"          bytes width: "gxgl$, bytes width, "The number of CHAR required to display BYTES",
      $"     long bytes width: "gxgl$, long bytes width, "The number of CHAR required to display LONG BYTES"
    ));
 
    printf(($" a:       "f(b5)$, BBBBB a));
    printf(($" b:       "f(b5)$, BBBBB b));
    printf(($" a AND b: "f(b5)$, BBBBB(a AND b)));
    printf(($" a OR b:  "f(b5)$, BBBBB(a OR b)));
    printf(($" a XOR b: "f(b5)$, BBBBB(a XOR b)));
    printf(($" NOT b:   "f(b5)$, BBBBB NOT a));
    printf(($" a SHL "d": "f(b5)$, shift, BBBBB(a SHL shift)));
    printf(($" a SHR "d": "f(b5)$, shift, BBBBB(a SHR shift)));
 
    printf(($" a SLC "d": "f(b5)$, shift, BBBBB(a SLC shift)));
    printf(($" a SRC "d": "f(b5)$, shift, BBBBB(a SRC shift)))
COMMENT with original ALGOL 68 character set;
    printf(($" a AND b: "f(b5)$, BBBBB(a ∧ b)));
    printf(($" a OR b:  "f(b5)$, BBBBB(a ∨ b)));
    printf(($" NOT b:   "f(b5)$, BBBBB ¬ a));
    printf(($" a SHL "d": "f(b5)$, shift, BBBBB(a ↑ shift)));
    printf(($" a SHR "d": "f(b5)$, shift, BBBBB(a ↓ shift)));
Also:
    printf(($" a AND b: "f(b5)$, BBBBB(a /\ b)));
    printf(($" a OR b: "f(b5)$, BBBBB(a \/ b)));
COMMENT
  );
 
  bitwise(BIN 255, BIN 170, 5)
# or using alternate representations for 255 and 170 in BITS #
CO
  bitwise(2r11111111,2r10101010,5);
  bitwise(4r3333,4r2222,5);
  bitwise(8r377,8r252,5);
  bitwise(16rff,16raa,5)
END CO
)