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.

 1Encoding.default_external = Encoding::BINARY
 2Encoding.default_internal = Encoding::BINARY
 3
 4class String
 5
 6    def format8bits()
 7    
 8        tmp = "0b"
 9        
10        (8 - self.length).times {tmp << "0"}
11        
12        return tmp + self
13    
14    end
15
16end
17
18str = ARGV[0]
19byte2 = (ARGV[1])[0].ord
20
21str.each_byte do |byte1|
22
23    puts <<-ENDBLOCK
24>>>>>
25NOT
26    #{byte1.chr} : #{byte1.to_s(2).format8bits}
27  ~ #{byte1.chr} : #{((~byte1)&0xFF).to_s(2).format8bits}
28
29Decalage 4 bits vers la gauche
30    #{byte1.chr} : #{byte1.to_s(2).format8bits}
31  <<4 : #{((byte1<<4)&0xFF).to_s(2).format8bits}
32
33Decalage 4 bits vers la droite
34    #{byte1.chr} : #{byte1.to_s(2).format8bits}
35  >>4 : #{((byte1&0xFF)>>4).to_s(2).format8bits}
36  
37NOT et decalage vers la droite de 4 sans le &0XFF
38    #{byte1.chr} : #{byte1.to_s(2).format8bits}
39  ~ #{byte1.chr} : #{((~byte1)&0xFF).to_s(2).format8bits}
40  >>4 : #{(((~byte1)>>4)&0xFF).to_s(2).format8bits}
41 
42NOT et decalage vers la droite de 4 avec le &0XFF
43    #{byte1.chr} : #{byte1.to_s(2).format8bits}
44  ~ #{byte1.chr} : #{((~byte1)&0xFF).to_s(2).format8bits}
45  >>4 : #{((((~byte1) & 0xFF)>>4)&0xFF).to_s(2).format8bits}
46
47OR
48    #{byte1.chr} : #{byte1.to_s(2).format8bits}
49  | #{byte2.chr} : #{byte2.to_s(2).format8bits}
50  =   : #{((byte1|byte2)&0xFF).to_s(2).format8bits}
51
52AND
53    #{byte1.chr} : #{byte1.to_s(2).format8bits}
54  & #{byte2.chr} : #{byte2.to_s(2).format8bits}
55  =   : #{((byte1&byte2)&0xFF).to_s(2).format8bits}
56
57XOR
58    #{byte1.chr} : #{byte1.to_s(2).format8bits}
59  ^ #{byte2.chr} : #{byte2.to_s(2).format8bits}
60  =   : #{((byte1^byte2)&0xFF).to_s(2).format8bits}
61
62<<<<<
63ENDBLOCK
64
65end
66

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

<<<<<