Gibt 1 zurück, wenn Bits in einer Ganzzahl gleich 1 sind, indem Bitoperationen in C verwendet werden

8

Ich habe stundenlang über dieses Problem nachgedacht. Hier ist es:

  

Schreiben Sie einen Ausdruck, der 1 zurückgibt, wenn eine gegebene ganze Zahl "x" irgendwelche Bits hat, die gleich 1 sind. Geben Sie andernfalls 0 zurück.

Ich verstehe, dass ich im Grunde nur versuche herauszufinden, ob x == 0 ist, weil das der einzige Int ist, der keine 1 Bits hat, aber ich kann keine Lösung finden. Sie dürfen keine traditionellen Kontrollstrukturen verwenden. Sie können bitweise Operatoren, Addition, Subtraktion und Bitverschiebungen verwenden. Vorschläge?

    
jjAman 08.02.2011, 17:31
quelle

13 Antworten

4

Hier ist das Beste, was ich mir vorstellen konnte:

%Vor%

wobei BITS = 32 für 32-Bit-Eingänge, d.h. BITS = sizeof(int) * CHAR_BIT;

Hier ist ein Testprogramm:

%Vor%     
Paul R 08.02.2011 17:38
quelle
2

Mit !! x erhalten Sie die richtige Antwort. Da! 0 = 1 und! (Jede Zahl ungleich Null) = 0.

    
Casey 12.02.2015 04:19
quelle
1

Maskiere jedes der Bits einzeln, verschiebe sie alle in die lsb Position und oder zusammen.

    
Oliver Charlesworth 08.02.2011 17:33
quelle
1

Für einen 32-Bit-Wert gilt Folgendes für alle Bitmuster.

return (a | -a) & gt; & gt; 31;

    
Taliadon 08.02.2011 19:06
quelle
0

Sie könnten einfach Ihre int auf eine bool umwandeln. Aber ich bezweifle, dass das der Zweck deiner Hausaufgaben ist; -)

    
Justin Morgan 08.02.2011 17:40
quelle
0
%Vor%     
vz0 08.02.2011 17:52
quelle
0

Für 32-Bit-Ganzzahlen

%Vor%     
Luka Rahne 08.02.2011 17:58
quelle
0

Wie wäre es! (x & amp; & amp; x) & amp; & amp; x?

%Vor%

Es scheint Arbeit, aber ich bin nicht sicher, wenn Überlauf passiert.

    
twoyoung 21.10.2013 10:32
quelle
0

0 || number - das gibt nur 0 zurück, wenn die Zahl 0 ist und gibt 1 zurück, wenn die Zahl eine andere Zahl als 0 ist. Da eine Zahl ohne irgendein Bit wie 1 gleich 0 ist, müssen wir sie mit 0 überprüfen.

    
anuragagarwal561994 22.01.2014 08:51
quelle
-1

ungeprüft, das ist das erste, was mir in den Sinn kam:

%Vor%

wenn e == 16 nach der Schleife n 0 ist.

    
BlackBear 08.02.2011 17:49
quelle
-1

Bitweises UND mit 0 und eine beliebige Zahl müssen gleich Null sein, aber der einzige idiotensichere Test wäre mit 0xFFFF, oder jedes Bit wird gesetzt. Um alle Bits zu setzen, sollten Sie einen int Zeichen haben und es -1 zuweisen. Sie haben dann ein int mit allen Bits auf 1 gesetzt, unabhängig von der Größe.

Also meine Antwort wäre bitweise UND mit -1

    
Dave 08.02.2011 18:03
quelle
-2

Ich glaube, das ist der einfachste Weg.

%Vor%

Der einzige Zeitpunkt, an dem Ihr x keine 1 hat, ist, wenn alle Bits 0 sind, oder x == 0. Also 0 | 0 - & gt; 0 sonst 0 | x - & gt; nicht Null.

    
Kevin Zen 01.04.2015 04:18
quelle
-2

In der C-Sprache wird jeder andere Wert als NULL (entweder positiv oder negativ) als WAHR behandelt. Und es sollte eine Bedingung geben, um zu überprüfen, ob die Lösung Ihrer Frage eine NULL oder EINE (oder eine andere als NULL) zurückgibt. Daher ist diese Antwort perfekt gemäß Ihrer Anforderung. Dies verwendet nur bitweise Operatoren.

%Vor%

Diese Zeile gibt NULL zurück, wenn keines der Bits in "x" 1 ist, und gibt Non-Zero (TRUE in einer Richtung) zurück, wenn eines der Bits 1 in "x" ist.

    
Waqas Shabbir 24.07.2015 09:34
quelle