Bitmap

From Esolang
Jump to navigation Jump to search

Bitmap is a computing system by Esolang wiki user User:Mia Boudreau that performs computations by mapping bits.

System explanation

Since base- digits can form possible numbers, any bitwise operation with two inputs and one output can be described as a -bit number.

For example, , so , which is equivalent to a XOR gate.

Applying sequential operations with different input/output addresses and maps is able to perform larger computations.

The interpreter for a single command can be viewed as a single operation:

  1. Copy bit from map at index formed from bits at addresses src_a and src_b to bit at address dest.

Compiler

This C compiler uses a bit integer as the array. It is worth noting it only uses bitwise operations.

int run(int n, char map, char src_a, char src_b, char dest){
 int look = get_bit(map, get_bit(n,src_a)|get_bit(n,src_b)<<1),
 out_bit = 1<<dest;
 look ? n |= out_bit : (n &= ~out_bit);
 return n;
}
int get_bit(int n, int i){return n>>i&1;}

Variations are obvious for arrays of any size:

long long run(long long n, char map, char src_a, char src_b, char dest){
 int look = get_bit(map, get_bit(n,src_a)|get_bit(n,src_b)<<1),
 out_bit = 1<<dest;
 return look ? n|out_bit : (n&~out_bit);
}
int get_bit(long long n, int i){return n>>i&1;}

An economical system is to have a separate read-only array for sequentially read instructions. This allows for the data array to only be used for memory.

int run_str(int n, int *c, int L){
 for(int x = 0; x < L; x += 4){
  n = run(n,c[x],c[x+1],c[x+2],c[x+3]);
 }
 return n;
}

Working code example

#include <stdio.h>
#include <stdlib.h>

int run(int n, char map, char src_a, char src_b, char dest);
int get_bit(int n, int i);
int xor(int n, char src_a, char src_b, char dest);

int main(){
 int n = 01; // Input is 01; output of XOR will be 1
 for(int i = 0; i < 3; i++){
  printf("%d", get_bit(n, i)); // Initial array is '100'
 }
 printf("\n");
 
 n = xor(n, 0, 1, 2); // [0] XOR [1] -> [2]
 
 for(int i = 0; i < 3; i++){
  printf("%d", get_bit(n, i)); // Resultant array is '101'
 }
 return 0;
}

int run(int n, char map, char src_a, char src_b, char dest){
 int look = get_bit(map, get_bit(n,src_a)|get_bit(n,src_b)<<1),
 out_bit = 1<<dest;
 return look ? n|out_bit : (n&~out_bit);
}
int get_bit(int n, int i){return n>>i&1;}

int xor(int n, char src_a, char src_b, char dest){
 run(n, 6, src_a, src_b, dest);
}

Example functions

The machine language is in the format (map, src_a, src_b, dest).

set(dest):
 15, 0, 0, dest

clear(dest):
 0, 0, 0, dest

or(src_a, src_b, dest):
 14, src_a, src_b, dest

or_4bit(src_a, src_b, dest):
 or(src_a, src_b, dest)
 or(src_a+1, src_b+1, dest+1)
 or(src_a+2, src_b+2, dest+2)
 or(src_a+3, src_b+3, dest+3)

copy(src, dest):
 or(src, src, dest)

copy_4bit(src, dest):
 or_4bit(src, src, dest) 

shift_right_4bit(src, dest)
 copy(src+1, dest)
 copy(src+2, dest+1)
 copy(src+3, dest+2)
 clear(dest+3)

shift_left_4bit(src, dest)
 copy(src+2, dest+3)
 copy(src+1, dest+2)
 copy(src, dest+1)
 clear(dest)

swap(src_a, src_b):
 copy(src_a, 0)
 copy(src_b, src_a)
 copy(0, src_b)

swap_4bit(src_a, src_b):
 swap(src_a, src_b)
 swap(src_a+1, src_b+1)
 swap(src_a+2, src_b+2)
 swap(src_a+3, src_b+3)

nor(src_a, src_b, dest):
 1, src_a, src_b, dest

nor_4bit(src_a, src_b, dest):
 nor(src_a, src_b, dest)
 nor(src_a+1, src_b+1, dest+1)
 nor(src_a+2, src_b+2, dest+2)
 nor(src_a+3, src_b+3, dest+3)

not(src, dest):
 nor(src, src, dest)

not_4bit(src, dest):
 not(src, dest)
 not(src+1, dest+1)
 not(src+2, dest+2)
 not(src+3, dest+3)

and(src_a, src_b, dest):
 8, src_a, src_b, dest

and_4bit(src_a, src_b, dest):
 and(src_a, src_b, dest)
 and(src_a+1, src_b+1, dest+1)
 and(src_a+2, src_b+2, dest+2)
 and(src_a+3, src_b+3, dest+3)

nand(src_a, src_b, dest):
 7, src_a, src_b, dest

nand_4bit(src_a, src_b, dest):
 nand(src_a, src_b, dest)
 nand(src_a+1, src_b+1, dest+1)
 nand(src_a+2, src_b+2, dest+2)
 nand(src_a+3, src_b+3, dest+3)
 
xor(src_a, src_b, dest):
 6, src_a, src_b, dest

xor_4bit(src_a, src_b, dest):
 xor(src_a, src_b, dest)
 xor(src_a+1, src_b+1, dest+1)
 xor(src_a+2, src_b+2, dest+2)
 xor(src_a+3, src_b+3, dest+3)

nxor(src_a, src_b, dest):
 9, src_a, src_b, dest

nxor_4bit(src_a, src_b, dest):
 nxor(src_a, src_b, dest)
 nxor(src_a+1, src_b+1, dest+1)
 nxor(src_a+2, src_b+2, dest+2)
 nxor(src_a+3, src_b+3, dest+3)

half_adder(src_a, src_b, dest_a, dest_b):
 xor(src_a, src_b, dest_a)
 and(src_a, src_b, dest_b) 

increment_4bit(src, dest):
 set(0)
 half_adder(0, src, dest, 0)
 half_adder(0, src+1, dest+1, 0)
 half_adder(0, src+2, dest+2, 0)
 half_adder(0, src+3, dest+3, 0)