Szukam metody numer 1 w 32 bitowym numerze bez użycia pętli pomiędzy. może pomóc dowolne ciało i dostarczyć mi kod lub algorytm , aby to zrobić. Z góry dzięki.liczba 1 w 32 bitowym numerze
Odpowiedz
Patrz kanonicznej odniesienia: Bit Twiddling Hacks
Należy pamiętać, że elementy wewnętrzne Java są zawsze * podpisane i odpowiednio zmodyfikowane. – erickson
rozdzielać liczba 32-bitowa w czterech 8-bitowych liczb (patrz nieco przesuwa operatora, odlewanie itp)
Następnie za pomocą odnośnika z 256 wpisów, które przetwarza 8 bit liczba do liczby zestawów bitów. Dodaj cztery wyniki, presto!
także zobaczyć, co powiedział Mitch Wheat - nieco błahy może być dużo zabawy;)
Zobacz Integer.bitCount(int)
. Można odwołać się do kodu źródłowego, jeśli chcesz zobaczyć, jak to działa; wielu z rutyny nieco twiddling klasy za Integer
są pobierane z Hacker's Delight.
Tak! Po co używać egzotycznego hackowania, gdy istnieje już dostępna metoda. – Buhb
Użycie wbudowanego ułatwi również przyszłym wersjom JVM zrozumienie, że do tego celu można użyć instrukcji POPCNT SSE4.2. –
+1 dla metody JRE. –
Można go zdefiniować rekurencyjnie:
int bitcount(int x) {
return (x==0) ? 0 : (x & 1 + bitcount(x/2));
}
Powyższy kod nie został przetestowany i prawdopodobnie działa tylko dla x> = 0. Mamy nadzieję, że dostaniesz pomysł Anyways ...
-1 dla użycia rekursji, gdy zażądano "braku pętli". Oczywiście, nie używa on konstrukcji pętli, ale nadal działa w czasie innym niż O (1). – unwind
Przepraszamy. Pytanie to przypominało mi zadanie domowe i chciałem przedstawić inny pogląd. W przypadku aplikacji krytycznych zarówno pod względem wydajności, jak i większości zastosowań nie-teoretycznych, warto sięgnąć po rozwiązania typu "bit-twiddling"! – SteinNorheim
klasyczna to: powrót (x == 0)? 0: (1 + bitcount (x & (x - 1))); – Olexiy
mój osobisty faworyt, bezpośrednio z Bit Twiddling Hacks:
v = v - ((v >> 1) & 0x55555555);
v = (v & 0x33333333) + ((v >> 2) & 0x33333333);
c = ((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 24;
NB: To nie będzie działać poprawnie z typem int podpisanym przez Javę - ale podstawowym pomysłem jest ten używany przez bibliotekę. – erickson
Myślę, że chcesz >>> zamiast >>. – finnw
@finnw: Przypuszczam, że masz na myśli w Javie (ponieważ nie ma takiego operatora w C, gdzie pierwszy raz zobaczyłem/wykorzystałem sztuczkę), w takim przypadku masz rację, utrzymywanie znaku jest błędne. –
krótki, nieprzyzwoicie zoptymalizowaną odpowiedź (w C):
int pop(unsigned x) {
x = x - ((x >> 1) & 0x55555555);
x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
x = (x + (x >> 4)) & 0x0F0F0F0F;
x = x + (x >> 8);
x = x + (x >> 16);
return x & 0x0000003F;
}
Aby zrozumieć, dlaczego ta magia działa, patrz: Quest for Accelerated Population Count autorstwa Henry S. Warren, Jr. rozdział 10 w Piękny kod.
Ale pytanie dotyczyło Java, aw Javie nie ma niepodpisanego 32-bitowego typu int, a to nie działa z podpisem 32-bitowym w języku Java . – Jesper
O ile widzę, Java nie jest wymieniona w pytaniu. I może się mylę, ale tagi nie powinny być używane do ograniczania pytania do danego języka. – lindelof
IMO jesteś w błędzie. Jeśli pytanie jest oznaczone językiem Java, co jeszcze to oznacza, poza tym pytanie dotyczy języka Java? Może pytający powinien także wspomnieć w tekście, że mówią o Javie, ale jeśli nie, to nie sądzę, że powinniśmy udawać, że to nie jest oznaczona Java. Jeśli możesz przyjąć, że odpowiedź na C jest akceptowalna, to mogę przyjąć, że odpowiedź C na GCC jest akceptowalna i że użyję __builtin_popcount. Ale to nie pomaga zbytnio pytającemu ;-) –
Poniżej JDK 1,5 realizacja z Integer.bitCount
public static int bitCount(int i) {
// HD, Figure 5-2
i = i - ((i >>> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
i = (i + (i >>> 4)) & 0x0f0f0f0f;
i = i + (i >>> 8);
i = i + (i >>> 16);
return i & 0x3f;
}
- 1. Opis rozmiaru obiektu CLR między 32-bitowym a 64-bitowym
- 2. Grubość Datetime między 32-bitowym i 64-bitowym systemem Windows
- 3. Uzyskiwanie dostępu> 2,3,4 GB Pliki w trybie 32-bitowym na 64-bitowym (lub 32-bitowym) systemie Windows
- 4. PHP json_decode na 32-bitowym serwerze
- 5. TensorFlow na 32-bitowym systemie Linux?
- 6. Jak wymusić uruchomienie aplikacji .NET w trybie 32-bitowym
- 7. Jak mogę skompilować openSSL w trybie 32-bitowym w systemie 64-bitowym?
- 8. Jak uruchomić plik wsadowy w trybie 64-bitowym z pliku wsadowego w trybie 32-bitowym
- 9. Ograniczenie rozmiaru pliku dla SQLite w systemie 32-bitowym
- 10. Jak uruchomić 32-bitową aplikację .NET w środowisku 64-bitowym?
- 11. Skompiluj 32-bitową wersję binarną w systemie 64-bitowym
- 12. Sposób korzystania z PyCharm w trybie 32-bitowym
- 13. Czy 32-bitowe dodatki Excel działają w 64-bitowym Excelu?
- 14. Wymuś uruchomienie maszyny wirtualnej w trybie 32-bitowym WebStart JNLP
- 15. Tworzenie 64-bitowego pliku wykonywalnego w 32-bitowym systemie operacyjnym
- 16. Kompilacja złożony z 32 bitów w systemie 64-bitowym (Ubuntu)
- 17. Budynek 64-bitowy dll z MinGW 32-bitowym w Eclipse
- 18. CAAnimacja -1 liczba powtórzeń?
- 19. W jaki sposób aplikacja .NET może działać z 32-bitowym i 64-bitowym pakietem Office?
- 20. Wszystkie możliwe wartości os.arch w 32-bitowym JRE i 64-bitowym Jre
- 21. Dlaczego mmap plik 4GB na 32-bitowym armv7l powiodło się?
- 22. Jak zbudować 32-bitowe moduły XS dla 32-bitowego niestandardowego Perla w 64-bitowym systemie CentOS?
- 23. Nie można skompilować 32-bitowej wersji z 64-bitowym g ++
- 24. Kompilacja 32-bitowego asemblera na 64-bitowym ubuntu
- 25. 32-bitowa dostępność języka Java na 64-bitowym komputerze
- 26. Uruchom bibliotekę 32-bitową na iPhonie 5s 64-bitowym
- 27. Czy mogę zbudować aplikację x64 na komputerze 32-bitowym?
- 28. Kompilacja 32-bitowa z 64-bitowym llvm-gcc
- 29. Kompilacja na 64-bitowym systemie dla systemu 32 bit - Kompatybilność
- 30. Losowa liczba: 0 lub 1
np chcesz polubić od 2344 do 2,3,4,4? proszę wyjaśnić, wprowadzając dane wejściowe i wymagane dane wyjściowe. –