Come si imposta e si controlla un singolo bit in un linguaggio di programmazione che non supporta operazioni bit a bit?

3

Sto utilizzando un linguaggio di programmazione (più un linguaggio di scripting) che non supporta alcun operatore di bit come AND, OR, XOR, NOT (e anche shift).

Operazioni aritmetiche e logiche comuni come + - * /% > > = < < = ==! =, logico AND, OR, NOT e il flusso di controllo (while, for, if, ...) sono tuttavia supportati. È come un "sottoinsieme di C", ma senza questi operatori binari. La mia domanda non è comunque indirizzata a quella lingua particolare.

Mi chiedevo se esiste un modo (matematico?) per impostare e controllare un bit in una posizione specifica in un linguaggio di programmazione che non supporta le operazioni bit a bit:

a = 0;               //00000000b
a = togglebit(a, 5); //00100000b
a = togglebit(a, 2); //00100100b


a = 0xFE;            //11111110b
bool result = checkbit(a, 4); //true

Ad esempio, c'è un modo per eseguire uno spostamento binario sinistro o destro usando la moltiplicazione o divisione integer:

a = a * 2; //similar to left  shift : a = a << 1;
a = a / 2; //similar to right shift : a = a >> 1;

Sto cercando qualcosa di simile ma per impostare o controllare un flag.

    
posta tigrou 30.08.2014 - 10:39
fonte

1 risposta

12

Per controllare il n bit, sposta a destra n volte. Se il bit è impostato, il risultato sarà dispari (i numeri sono dispari se e solo se il loro bit finale è 1).

function checkbit(a, n)
  n times:
    a = a / 2   (integer division)
  return a % 2
end

Per impostare il bit n , aggiungi 2 ^ n solo se il bit non è ancora impostato.

function pow2(n):   (returns 2^n)
  result = 1
  n times: result = result * 2
  return result
end

function setbit(a, n)
  if checkbit(a, n):
    return a
  else:
    return a + pow2(n)
end

La commutazione è simile, ma sottraiamo se il bit è già impostato:

function togglebit(a, n)
  if checkbit(a, n):
    return a - pow2(n)
  else:
    return a + pow2(n)
end

La negazione bit a bit dipende da quanto sono grandi le maschere di bit; in particolare, il negativo bit a bit di un n bitbitk a è 2 ^ n-1-a . Se stai usando 16 bit, sarebbe 65535-a .

    
risposta data 30.08.2014 - 11:30
fonte

Leggi altre domande sui tag