int temp = 0x5E; // in binary 0b1011110.
Czy istnieje taki sposób, aby sprawdzić, czy bit 3 w temp jest 1 czy 0 bez przesuwania bitów i maskowania.
Chcę tylko wiedzieć, czy jest do tego jakaś wbudowana funkcja, czy też jestem zmuszony napisać ją sam.
c++
c
bit-manipulation
Mediolan
źródło
źródło
!= 0
jest prawdą, więc po co?1
jest tak samo prawdziwe jak0.1415
!Sprawdź, czy ustawiony jest bit N (zaczynając od 0):
Nie ma do tego wbudowanej funkcji.
źródło
1 << 0
?? Przepraszam, zmieszany.1<<0
1 bez żadnej zmiany (zmiana 0), czyli1<<0 == 1
Po prostu użyłbym zestawu std :: bitset, jeśli jest to C ++. Prosty. Bezpośredni. Nie ma szans na głupie błędy.
albo co powiesz na tę głupotę
źródło
std::bitset<CHAR_BIT * sizeof(int)>
być jeszcze bardziej poprawnymTak, wiem, że nie „muszę” tego robić w ten sposób. Ale zazwyczaj piszę:
Na przykład:
Między innymi takie podejście:
Np .: # zdefiniować ABS (X) (((X) <0)? - (X): (X))
ABS (i ++);
źródło
To, co robi wybrana odpowiedź, jest w rzeczywistości złe. Poniższa funkcja zwróci pozycję bitu lub 0 w zależności od tego, czy bit jest faktycznie włączony. Nie o to prosił plakat.
Oto, czego pierwotnie szukał plakat. Poniższa funkcja zwróci 1 lub 0, jeśli bit jest włączony, a nie pozycja.
źródło
bool has_feature = CHECK_BIT(register, 25);
Dobrze wiedzieć, że mogę to zrobić bez podwójnego negacji.Zgodnie z tym opisem pól bitowych istnieje metoda bezpośredniego definiowania i uzyskiwania dostępu do pól. Przykład w tym wpisie brzmi:
Jest tam również ostrzeżenie:
źródło
Możesz użyć Bitsetu - http://www.cppreference.com/wiki/stl/bitset/start .
źródło
Użyj std :: bitset
źródło
temp
musi być odzwierciedlona, aby uczynić ją „gruboziarnistą”?Jest, a mianowicie najbardziej zawzięta instrukcja wewnętrzna.
źródło
Używam tego:
gdzie „pos” jest zdefiniowane jako 2 ^ n (ig 1,2,4,8,16,32 ...)
Zwraca: 1 jeśli prawda 0 jeśli fałsz
źródło
4 = 2^(3-1)
pozycji bitu 3, ponieważ było to częścią pytania.Próbowałem odczytać 32-bitową liczbę całkowitą, która definiowała flagi obiektu w plikach PDF, ale to nie działało dla mnie
co naprawiło to zmiana definicji:
operand & zwraca liczbę całkowitą z flagami, które obie mają w 1, i nie był poprawnie rzutowany na wartość logiczną, to załatwiło sprawę
źródło
!= 0
zrobiłby to samo. Nie wiem, czym mogą się różnić wygenerowane instrukcje maszynowe.Możesz "zasymulować" przesuwanie i maskowanie: jeśli ((0x5e / (2 * 2 * 2))% 2) ...
źródło
W przypadku rozwiązania niskiego poziomu specyficznego dla x86 użyj kodu operacji x86 TEST .
Twój kompilator powinien jednak zmienić _bittest w to ...
źródło
Dlaczego nie użyć czegoś tak prostego jak to?
WYJŚCIE: binarne:
11111111
źródło
std::cout << (((status & (1 << i)) ? '1' : '0');
. Powinieneś użyćCHAR_BIT
stałej od<climits>
zamiast sztywnego kodowania 8 bitów, chociaż w tym przypadku wiesz, że wynik i tak będzie wynosić 8, ponieważ używaszuint8_t
pos - pozycja bitu zaczynająca się od 0.
zwraca 0 lub 1.
źródło
jeśli chcesz naprawdę zakodować sposób:
zwróć uwagę na to zależne od hw i zakłada, że ta kolejność bitów 7654 3210, a var wynosi 8 bitów.
Prowadzi do:
1 0 1 0
źródło
Chociaż jest już dość późno, aby odpowiedzieć teraz, istnieje prosty sposób, aby sprawdzić, czy N-ty bit jest ustawiony, czy nie, po prostu za pomocą operatorów matematycznych POWER i MODULUS.
Powiedzmy, że chcemy wiedzieć, czy „temp” ma ustawiony N-ty bit, czy nie. Poniższe wyrażenie boolowskie da wartość true, jeśli bit jest ustawiony, 0 w przeciwnym razie.
Rozważmy następujący przykład:
Jeśli chcę wiedzieć, czy 3. bit jest ustawiony, czy nie, otrzymuję
Zatem wyrażenie zwraca prawdę, wskazując, że ustawiono trzeci bit.
źródło
Jedną z metod będzie sprawdzenie w ramach następującego warunku:
Program wyjaśniający będzie:
Wynik:
źródło
Robię to:
LATGbits.LATG0 = ((m & 0x8)> 0); // aby sprawdzić, czy bit-2 z m to 1
źródło
najszybszym sposobem wydaje się być tablica wyszukiwania masek
źródło