BitShift
BitShift was created by user:Bas to reminisce the old days, when computers only understood zeroes and ones.
Language overview
A BitShift program only knows of 2 valid instructions, 0
and 1
. Other characters are invalid and will thus throw an error on execution. Instructions are interpreted as alternating 0
's and 1
's. Whenever 2 of the same instructions are entered, the program will count the alternating instructions preceding it and perform a command. It doesn't matter if you start your program with a 0
or a 1
.
0101011010011101011
will perform the instructions 6, 4, 2, 1, 5, 1
010101 1010 01 1 10101 1
. Here, the non alternating characters have been seperated by a space for improved readability.
BitShift programs don't have any stack operations or loops. They have one single value which can be altered.
This value can range from 0-255 (0000 0000 - 1111 1111)
Instructions
BitShift supports the following instructions:
Alternations | Description |
---|---|
1
|
Shift the value 1 bit to the left (0000 0001 > 0000 0010) |
2
|
Shift the value 1 bit to the right (0000 0010 > 0000 0001) |
3
|
XOR the value with 1 (0000 0000 > 0000 0001) |
4
|
XOR the value with 128 (0000 0000 > 1000 0000) |
5
|
Set the value to 0 |
6
|
Convert the value to an ASCII character and print it |
7
|
Read an ASCII character from user input and set the value to it |
Examples
Hello, World!
0100000100000101011010011011010100110100110100110101001010110010001001010111100110011110101001000000010101101111011110111011101101010001000101100101011111011101001010110111101110111101010001000010101111101101010
Cat
0101010010101
Implementations
The simplistic nature of BitShift is reflected in the following implementation in Common Lisp:
(defun interpret-BitShift (code) "Interprets the BitShift CODE and returns ``NIL." (declare (type string code)) (let ((value 0) (alternations 0)) (declare (type (unsigned-byte 8) value) (type (integer 0 *) alternations)) (flet ((execute-command () (case alternations (1 (setf value (ldb (byte 8 0) (ash value 1)))) (2 (setf value (ldb (byte 8 0) (ash value -1)))) (3 (setf value (logxor value 1))) (4 (setf value (logxor value 128))) (5 (setf value 0)) (6 (write-char (code-char value))) (7 (format T "~&Please input a character: ") (setf value (char-code (read-char))) (clear-input)) (T (error "Invalid alternations: ~d." alternations))))) (loop for previous-bit of-type (or null character) = NIL then current-bit for current-bit of-type (or null character) across code for position of-type fixnum from 0 do (cond ((not (member current-bit '(#\0 #\1) :test #'char=)) (error "Not a bit at position ~d: ~s." position current-bit)) ((null previous-bit) (incf alternations)) ((char/= previous-bit current-bit) (incf alternations)) (T (execute-command) (setf alternations 1))) finally (execute-command)))))
Interpreter
- Official BitShift interpreter (from the Wayback Machine; retrieved on 4 August 2016)
- Common Lisp implementation of the BitShift programming language.