Confronta i bit in C

Jinku Hu 12 ottobre 2023
Confronta i bit in C

Questo articolo spiegherà diversi metodi su come confrontare i bit in C.

Implementare una funzione personalizzata utilizzando XOR bit per bit e operazioni AND per il confronto di bit in C

Generalmente, il confronto dei bit implica l’accesso a valori di bit singolo e l’esecuzione delle operazioni necessarie, come l’implementazione di campi di bit utilizzando le parole chiave union e struct. Tuttavia, le operazioni bit per bit offrono un metodo più efficiente per confrontare i bit specificati in numeri. In questo caso, implementiamo una funzione separata adatta per il tipo u_int32_t, che è garantito per avere una larghezza di 32 bit.

Il programma di esempio accetta tre numeri interi come argomenti della riga di comando, i primi due dei quali sono i numeri che vengono confrontati, mentre il terzo numero intero specifica l’n-esimo bit. Nota che convertiamo gli elementi argv usando strtol, perdendo così un po’ di precisione quando memorizziamo i valori restituiti nel tipo u_int32_t. La funzione compareBits dichiara due variabili locali che memorizzano valori intermedi - mask e tmp. Impostiamo l’n-esimo bit nella maschera spostando le posizioni 1 a sinistra di nth - 1. Quindi, entrambi i numeri di input dell’utente vengono modificati con XOR per ottenere le differenze di bit in ciascuna posizione con un bit impostato nel risultato che denota valori diversi. Infine, dobbiamo estrarre il bit dalla posizione n-esima e controllare se il valore è 0.

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

bool compareBits(u_int32_t n1, u_int32_t n2, u_int32_t nth) {
  u_int32_t mask, tmp;

  mask = 1 << (nth - 1);
  tmp = n1 ^ n2;

  if ((tmp & mask) == 0)
    return true;
  else
    return false;
}

int main(int argc, char *argv[]) {
  u_int32_t num1, num2, bit;

  if (argc != 4) {
    fprintf(stderr, "Usage: %s integer1 integer2 nth_bit \n", argv[0]);
    exit(EXIT_FAILURE);
  }

  num1 = strtol(argv[1], NULL, 0);
  num2 = strtol(argv[2], NULL, 0);
  bit = strtol(argv[3], NULL, 0);

  compareBits(num1, num2, bit) ? printf("bits equal!\n")
                               : printf("bits not equal!\n");

  exit(EXIT_SUCCESS);
}

formato di file di esempio:

./program 1234 1231 1

Formato file di input:

bits not equal!

Ad esempio, gli interi 1234 e 1231 sono rappresentati in binario come 00000000000000000000010011010010 e 00000000000000000000010011001111, rispettivamente. Così, XOR-ing questi due risultati in 00000000000000000000000000011101 rappresentazione binaria, che è infine AND-ed con la maschera 0000000000000000000000000000000010 per estrarre il valore di posizione del bit singolo. Se il risultato è tutti zeri, significa che i bit confrontati sono uguali; altrimenti è l’opposto.

In alternativa, però, possiamo abbreviare la funzione compareBits e spostare le operazioni XOR/AND nell’istruzione return come mostrato nel seguente codice di esempio. Si noti che la funzione restituisce l’opposto logico delle operazioni XOR/AND bit per bit, poiché restituiamo i messaggi corrispondenti nella funzione chiamante utilizzando il ? : Dichiarazione di locazione.

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

bool compareBits(u_int32_t n1, u_int32_t n2, u_int32_t nth) {
  u_int32_t mask;

  mask = 1 << (nth - 1);

  return !((n1 ^ n2) & mask);
}

int main(int argc, char *argv[]) {
  u_int32_t num1, num2, bit;

  if (argc != 4) {
    fprintf(stderr, "Usage: %s integer1 integer2 nth_bit \n", argv[0]);
    exit(EXIT_FAILURE);
  }

  num1 = strtol(argv[1], NULL, 0);
  num2 = strtol(argv[2], NULL, 0);
  bit = strtol(argv[3], NULL, 0);

  compareBits(num1, num2, bit) ? printf("bits equal!\n")
                               : printf("bits not equal!\n");

  exit(EXIT_SUCCESS);
}

formato di file di esempio:

./program 1234 1231 2

Formato file di input:

bits equal!
Autore: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook