Bitwise operations

From Rosetta Code
Task
Bitwise operations
You are encouraged to solve this task according to the task description, using any language you may know.

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


Write a function to perform a bitwise AND, OR, and XOR on two integers and perform a bitwise NOT on the first number.

Ada

The following program performs all required operations and prints the resulting values in base 2 for easy checking of the bit values.

with Ada.Text_Io; use Ada.Text_Io;

procedure Bitwise is
   type Byte is mod 2**8;
   package Byte_Io is new Ada.Text_Io.Modular_Io(Byte);
   
   A : Byte := 255;
   B : Byte := 170;
begin
   Put("A and B = "); Byte_Io.Put(Item => A and B, Base => 2); New_Line;
   Put("A or B  = "); Byte_IO.Put(Item => A or B, Base => 2); New_Line;
   Put("A xor B = "); Byte_Io.Put(Item => A xor B, Base => 2); New_Line;
   Put("Not A   = "); Byte_IO.Put(Item => not A, Base => 2); New_Line;
end bitwise;

The output of this program is:

A and B = 2#10101010#
A or B  = 2#11111111#
A xor B = 2#1010101#
Not A   = 2#0#

ALGOL 68

PROC bitwise = (BITS a, BITS b)VOID:
(
  printf(($"a and b: "gl$, a AND b));
  printf(($"a or b: "gl$, a OR b));
  printf(($"a xor b: "gl$, a XOR b));
  printf(($"not a: "gl$, NOT a))
);
bitwise(BIN 255, BIN 170)

The output of this program is:

a and b: FFFFFFFFFFFFFFFFFFFFFFFFTFTFTFTF
a or b: FFFFFFFFFFFFFFFFFFFFFFFFTTTTTTTT
a xor b: FFFFFFFFFFFFFFFFFFFFFFFFFTFTFTFT
not a: TTTTTTTTTTTTTTTTTTTTTTTTFFFFFFFF

BASIC

Compiler: QuickBasic 4.5

SUB bitwise (a, b)
  PRINT a AND b
  PRINT a OR b
  PRINT a XOR b
  PRINT NOT a
END SUB

C

void bitwise(int a, int b)
{
  printf("a and b: %d\n", a & b);
  printf("a or b: %d\n", a | b);
  printf("a xor b: %d\n", a ^ b);
  printf("not a: %d\n", ~a);
}

Forth

: bitwise ( a b -- )
  cr ." a = " over . ." b = " dup .
  cr ." a and b = " 2dup and .
  cr ." a  or b = " 2dup  or .
  cr ." a xor b = " over xor .
  cr ." not a = " invert . ;

Haskell

The operations in Data.Bits work on Int, Integer, and any of the sized integer and word types.

import Data.Bits

a = 255
b = 170

a_and_b = a .&. b
a_or_b  = a .|. b
a_xor_b = a `xor` b
not_a   = complement a

Java

public static void bitwise(int a, int b){
  System.out.println("a AND b: " + (a & b));
  System.out.println("a OR b: "+ (a | b));
  System.out.println("a XOR b: "+ (a ^ b));
  System.out.println("NOT a: " + ~a);
}

The call:

bitwise(4, 7);

will output:

a AND b: 4
a OR b: 7
a XOR b: 3
NOT a: -5

LSE64

over : 2 pick
2dup : over over

bitwise : \
  " A=" ,t over ,h sp " B=" ,t dup ,h nl \
  " A and B=" ,t 2dup & ,h nl \
  " A  or B=" ,t 2dup | ,h nl \
  " A xor B=" ,t over ^ ,h nl \
  " not A="  ,t      ~ ,h nl

\ a \ 7 bitwise   # hex literals

Python

def bitwise(a, b):
	print 'a and b: ' + str(a & b)
	print 'a or b: '  + str(a | b)
	print 'a xor b: ' + str(a ^ b)
	print 'not a: '   + str(~a)