Voici un exemple de code permettant d’effectuer des opérations booléennes sur 8 bits. On peut constater que sur un certain nombre d’opérations il est important de mettre l’ensemble des bits de poids forts à 0. En fait la conversion d’un caractère en son code ASCII nous renvoie un Fixnum codé sur 32 bits. Pour illustrer les effets de bord potentiels il faut regarder le décalage à droite avec ou sans le &0xFF juste après un NOT.

Encoding.default_external = Encoding::BINARY
Encoding.default_internal = Encoding::BINARY

class String

    def format8bits()
    
        tmp = "0b"
        
        (8 - self.length).times {tmp << "0"}
        
        return tmp + self
    
    end

end

str = ARGV[0]
byte2 = (ARGV[1])[0].ord

str.each_byte do |byte1|

    puts <<-ENDBLOCK
>>>>>
NOT
    #{byte1.chr} : #{byte1.to_s(2).format8bits}
  ~ #{byte1.chr} : #{((~byte1)&0xFF).to_s(2).format8bits}

Decalage 4 bits vers la gauche
    #{byte1.chr} : #{byte1.to_s(2).format8bits}
  <<4 : #{((byte1<<4)&0xFF).to_s(2).format8bits}

Decalage 4 bits vers la droite
    #{byte1.chr} : #{byte1.to_s(2).format8bits}
  >>4 : #{((byte1&0xFF)>>4).to_s(2).format8bits}
  
NOT et decalage vers la droite de 4 sans le &0XFF
    #{byte1.chr} : #{byte1.to_s(2).format8bits}
  ~ #{byte1.chr} : #{((~byte1)&0xFF).to_s(2).format8bits}
  >>4 : #{(((~byte1)>>4)&0xFF).to_s(2).format8bits}
 
NOT et decalage vers la droite de 4 avec le &0XFF
    #{byte1.chr} : #{byte1.to_s(2).format8bits}
  ~ #{byte1.chr} : #{((~byte1)&0xFF).to_s(2).format8bits}
  >>4 : #{((((~byte1) & 0xFF)>>4)&0xFF).to_s(2).format8bits}

OR
    #{byte1.chr} : #{byte1.to_s(2).format8bits}
  | #{byte2.chr} : #{byte2.to_s(2).format8bits}
  =   : #{((byte1|byte2)&0xFF).to_s(2).format8bits}

AND
    #{byte1.chr} : #{byte1.to_s(2).format8bits}
  & #{byte2.chr} : #{byte2.to_s(2).format8bits}
  =   : #{((byte1&byte2)&0xFF).to_s(2).format8bits}

XOR
    #{byte1.chr} : #{byte1.to_s(2).format8bits}
  ^ #{byte2.chr} : #{byte2.to_s(2).format8bits}
  =   : #{((byte1^byte2)&0xFF).to_s(2).format8bits}

<<<<<
ENDBLOCK

end

Dans l’exemple ci-dessous on fait effectuer des opération entre A et D.

>>>>>
NOT
    A : 0b01000001
  ~ A : 0b10111110

Decalage 4 bits vers la gauche
    A : 0b01000001
  <<4 : 0b00010000

Decalage 4 bits vers la droite
    A : 0b01000001
  >>4 : 0b00000100
  
NOT et decalage vers la droite de 4 sans le &0XFF
    A : 0b01000001
  ~ A : 0b10111110
  >>4 : 0b11111011
 
NOT et decalage vers la droite de 4 avec le &0XFF
    A : 0b01000001
  ~ A : 0b10111110
  >>4 : 0b00001011

OR
    A : 0b01000001
  | D : 0b01000100
  =   : 0b01000101

AND
    A : 0b01000001
  & D : 0b01000100
  =   : 0b01000000

XOR
    A : 0b01000001
  ^ D : 0b01000100
  =   : 0b00000101

<<<<<