2010-04-18 5 views
5

Ich habe versucht, dieses Problem für eine Weile zu lösen, konnte aber nicht mit ganzzahligen arithmetischen und bitweisen Operatoren. Ich denke jedoch, dass es möglich ist und es sollte ziemlich einfach sein. Was vermisse ich?Schnellste Möglichkeit zur Berechnung einer X-Bit Bitmaske?

Das Problem: einen ganzzahligen Wert von beliebiger Länge zu erhalten (dies das Problem nicht relevant ist), damit auf 1 und den Rest setzt beispielsweise gegeben 31 die Anzahl auf 0 X niedrigstwertigen Bits ist, I müssen einen ganzzahligen Wert erhalten, der gleich 0x7FFFFFFF ist (31 niedrigstwertige Bits sind 1 und die restlichen Nullen).

Natürlich, die Verwendung einer Schleife OR-in eine verschobene 1 zu einem Integer X mal wird die Aufgabe erledigen. Aber das ist nicht die Lösung, nach der ich suche. Es sollte mehr in Richtung (X << Y - 1) sein, also keine Schleifen verwenden.

Antwort

6
diese

Versuchen: (1 < < X) - 1

+0

Es sollte nicht, solange Sie zuerst 1 zu Uint werfen (weiß nicht C#, so weiß nicht wie). Dann wird es auf 0-1, d. H. 32 1 auf einer 32-Bit-Maschine ausgewertet. – doublep

+0

Sie haben die Lösung, nach der ich gesucht habe. Einfach und unkompliziert, ohne Schleifen. Und wenn X gleich der Bitlänge der Ganzzahl ist, werden alle Bits 1 wie erwartet. Es funktioniert sogar für die Ecke, wo X = 0. Danke. – Virtlink

0

Ich denke, die folgenden Arbeiten:

int mask = (int)Math.Pow(2, 31) - 1; 

Dieses ein einziger mathematischer Ausdruck ist, aber es ist nicht besonders effizient, weil die Leistung in dieser Art und Weise der Berechnung nicht wirklich eine gute Idee ist. Da wir jedoch sind eine Leistung von 2 zu berechnen, können wir das Gleiche mit Shift tun:

int mask = (1 << 31) - 1; 
+0

Die Einbeziehung von Fließkommazahlen und eine Umwandlung in 'int' ist wahrscheinlich nicht als" schnellste "zu qualifizieren ... – Joey

+0

Ja, ich habe festgestellt, wie ich das korrigieren kann, nachdem ich die erste Version gepostet habe, aber in der Zwischenzeit schon @doublep gepostet diese Lösung. Ich denke, ich werde meine Version hier lassen, da sie den Gedankengang erklärt, der mich dorthin gebracht hat :-). –

2

starten:

uint.MaxValue >> (32 - something)