2017-11-20 15 views
4

Ich bin wirklich verwirrt, kann aber keine einfache Aufgabe zu tun, wie es scheint:Wie setze ich Bits in Byte ohne Schleife

Ich muss einfach die Anzahl der Bits in Byte festlegen.

Zum Beispiel:

Ich brauche 5 Bits gesetzt. Also brauche ich 0xb00011111.

Ist es möglich, dies ohne Schleife zu tun?

Auch ich möchte nicht viel von #defines zu schreiben.

Antwort

9

Für jede ganze Zahl n kleiner als die Anzahl von Bits in dem Wort, der Maske, die Sie brauchen, ist:

const unsigned int mask = (1u << n) - 1; 

Keine Schleife erforderlich.

eine einfache Funktion unter Verwendung dieses:

unsigned int set_lsbs(unsigned int n) 
{ 
    return (1u << n) - 1; 
} 

Die zehn ersten Ergebnisse sind:

0: 0x0 
1: 0x1 
2: 0x3 
3: 0x7 
4: 0xf 
5: 0x1f 
6: 0x3f 
7: 0x7f 
8: 0xff 
9: 0x1ff 

Anmerkung: Die Syntax 0xb00011111 wird, ist einfach nicht keine binäre Literal, daß 'b' interpretiert als eine Hexadezimalziffer.

mask = ~((~0u) << 5) ; 

Diese einen ganzzahligen Wert schaffen wird mit den niedrigstwertigen 5 Bits auf 1 gesetzt und alle höher eingestellt:

+0

Ja, ich schrieb '0xb00011111' nur aus Gründen der Einfachheit. Vielen Dank! – Bulkin

+1

'0xb00011111' ist gültig C, aber es ist nicht wie das OP erwartet –

+1

Oh, rechts' 0xb00011111' ist gültig C aber ein sehr großes Hex-Literal :) Das OP beabsichtigte '0b00011111' was nicht gültig C ist, da C nicht habe binäre Literale. – Lundin

2

Erzeugung einer Maske, die die am wenigsten signifikanten 5 Bits, die für jede ganze Zahl Typ einzustellen kann somit durchgeführt werden -dem Bits unabhängig von integer-Typ auf 0 gesetzt

Speziell für den 8-Bit-Typen in Frage:

uint8_t mask = ~((~0u) << 5) ; 

um zu erklären, wie das funktioniert (ohne Berücksichtigung von Zwi ate Integer-Typen, die größer ist als 8 Bits):

  • ~0u (ein Kompliment von Null) = 0x11111111
  • Dann verschoben 5 = 0x11100000
  • schließlich das Einerkomplement des daß = 0x00011111
0

Ja ist es möglich, setn Bits in einer gegebenen Anzahl ohne Schleife, aber nicht random Bits, können Sie nsetzenBits.

für das Setzen eines single Bits in gegebenem no wir schreiben wie num = num | 1 << pos; warum 1? weil ich nur single Bit setzen möchte, können Sie auch 5 Bits setzen.

zur Einstellung 5-Bit-in nicht gegeben Sie unten Logik verwenden können

 `num = num | 31 << pos` ; 

warum 31? weil ich five Bit setzen möchte (31 = 1x2^0 + 1x2^1 + .. oder 31 ist die Summe von 5 Einsen)

+0

Was ist, wenn ich mehr Bits brauche? Mehr "Fall"? Nein, nur zwei bitweise Operationen machen denselben Code schnell und einfach. – Bulkin

+0

'double pow (float, int);' gibt doppelt zurück. Hast du Antworten vor deinem gelesen? Das ist ein sehr schlechtes Beispiel und ein sehr schlechter Rat. Besser löschen Sie es. – Bulkin

+0

Ich habe meine Antwort geändert – achal