Je voudrais simplement utiliser les opérateurs au niveau du bit:
t = (x & 0x0f)
x = (x & 0xf0) | (y & 0x0f)
y = (y & 0xf0) | t
qui travaillerait pour ce cas précis. Afin de le rendre plus adaptable, je l'ai mis dans une fonction, quelque chose comme:
def swapBits (x, y, s, e):
lookup = [255,127,63,31,15,7,3,1]
mask = lookup[s] & !lookup[e]
t = x & mask
x = (x & !mask) | (y & mask)
y = (y & !mask) | t
return (x,y)
Les valeurs de recherche vous permettent de spécifier quels bits d'échanger. Prenons les valeurs xxxxxxxx
pour x
et yyyyyyyy
pour y avec le bit de départ s
de 2 et le bit de fin e
de 6 (les bits commencent à zéro à gauche dans ce scénario).
x y s e t mask !mask execute
-------- -------- - - -------- -------- -------- -------
xxxxxxxx yyyyyyyy 2 6 starting point
00111111 mask = lookup[2](00111111)
00111100 & !lookup[6](11111100)
00xxxx00 t = x & mask
xx0000xx x = x & !mask(11000011)
xxyyyyxx | y & mask(00111100)
yy0000yy y = y & !mask(11000011)
yyxxxxyy | t(00xxxx00)