Vergleiche Bits in C

Jinku Hu 12 Oktober 2023
Vergleiche Bits in C

In diesem Artikel werden verschiedene Methoden zum Vergleichen von Bits in C erläutert.

Implementieren Sie eine benutzerdefinierte Funktion mit Bitwise XOR- und AND-Operationen für den Bitvergleich in C

Im Allgemeinen umfasst der Bitvergleich den Zugriff auf Einzelbitwerte und die Durchführung der erforderlichen Operationen, z. B. das Implementieren eines Bitfelds mit den Schlüsselwörtern union und struct. Bitweise Operationen bieten jedoch eine effizientere Methode zum Vergleichen bestimmter Bits in Zahlen. In diesem Fall implementieren wir eine separate Funktion, die für den Typ u_int32_t geeignet ist und eine Breite von 32 Bit garantiert.

Das Beispielprogramm verwendet drei Ganzzahlen als Befehlszeilenargumente, von denen die ersten beiden die verglichenen Zahlen sind, während die dritte Ganzzahl das n-te Bit angibt. Beachten Sie, dass wir argv-Elemente mit strtol konvertieren und dadurch beim Speichern der Rückgabewerte im Typ u_int32_t an Genauigkeit verlieren. Die Funktion compareBits deklariert zwei lokale Variablen, in denen Zwischenwerte gespeichert sind - mask und tmp. Wir setzen das n-te Bit in der Maske, indem wir die 1 um die Positionen n-te - 1 nach links verschieben. Dann werden beide Benutzereingabenummern XOR-verknüpft, um die Bitunterschiede an jeder Position mit einem gesetzten Bit im Ergebnis zu erhalten, das unterschiedliche Werte angibt. Schließlich müssen wir das Bit aus der n-ten Position extrahieren und prüfen, ob der Wert 0 ist.

#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);
}

Beispieldateiformat:

./program 1234 1231 1

Eingabedateiformat:

bits not equal!

Beispielsweise werden die Ganzzahlen 1234 und 1231 binär als 00000000000000000000010011010010 bzw. 00000000000000000000010011001111 dargestellt. Wenn diese beiden Elemente XOR-verknüpft werden, ergibt sich eine binäre Darstellung 00000000000000000000000000011101, die schließlich mit der Maske 000000000000000000000000000010 UND-verknüpft wird, um den Einzelbit-Positionswert zu extrahieren. Wenn das Ergebnis alle Nullen sind, bedeutet dies, dass die verglichenen Bits gleich sind. Ansonsten ist es umgekehrt.

Alternativ können wir jedoch die Funktion compareBits kürzen und XOR/AND-Operationen in die Anweisung return verschieben, wie im folgenden Beispielcode gezeigt. Beachten Sie, dass die Funktion das logische Gegenteil von bitweisen XOR/AND-Operationen zurückgibt, da wir die entsprechenden Nachrichten in der Aufruferfunktion mit dem ? : Mietvertrag.

#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);
}

Beispieldateiformat:

./program 1234 1231 2

Eingabedateiformat:

bits equal!
Autor: 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