2011-11-02 16 views
21

Powiel możliwe:
What is the tilde (~) in a C# enumeration?Co oznacza tylda w wyrażeniu?

znalazłem następujący fragment kodu na stronie this MSDN.

(((Width * Planes * BitCount + 31) & ~31)/8) * abs(Height) 

To rzeczywiście kompiluje się w C# visual studio 2010. Co dokładnie robi tylda "~" przed liczbą 31? Nigdy wcześniej nie widziałem tej składni w wyrażeniu.

+2

Jest to uzupełnienie bitowe. Zobacz poniższy link. [Jak Czy bitowe Uzupełnienie Operator Pracy] [1] [1]: http://stackoverflow.com/questions/791328/how-does-the-bitwise-complement-operator-work – Nerdtron

+0

Dla przyszłych ref tutaj jest lista operatorów C#. [C# Operators] (http://msdn.microsoft.com/en-us/library/6a71f45d.aspx) –

Odpowiedz

5

Jest to bitwise complement operator.

Zasadniczo, to odwraca bity:

0xffff0000 == ~0x0000ffff 

w kodzie których pisałeś, robi & ~31 zapewnia ostatnie 5 bitów 0 (bitowe i dopełnienia 11111, który jest 00000).

36

~ - bitwise NOT operator, w zasadzie odwrócić bity

31 w formacie binarnym jest 11111, więc ~ 31 == 00000, w zasadzie 0

+0

+1, ponieważ jest to najłatwiejsza do zrozumienia i najwyraźniejsza odpowiedź. –

+5

Przykład jest niepoprawny, ponieważ początkowe zero również jest odwrócone. To znaczy. '~ 31 = ~ 0x0000001F = 0xFFFFFFE0' – JimiLoe

+1

ten przykład nie jest poprawny Dopełniacz binarny dwójki 31 to 00000000000000000000000000011111 (który jest 0000001F w Heksie - jeśli 32bit jest obliczany) i operator" ~ "odwraca bity, więc odpowiedź będzie 11111111111111111111111111100000 , jeśli skonwertujemy to na dziesiętne, odpowiedź brzmi -32 Jeśli 64-bitowy, 31-ty dwójkowy dopełniacz jest 0000000000000000000000000000000000000000000000000000000000011111, a "~" odwraca bity, co jest równoważne ponownie do -32. AFAIK Nie ma 6-bitowego komputera, na którym działa C#, dlatego twoje jest nie tak. Jeśli jest 6-bitowy komputer, jest to poprawne. –

1

To operatory bitowe uzupełnienie - to właśnie sprawia, że ​​wszystkie bity 0 do 1s i odwrotnie ... zobacz MSDN reference.

W Twoim konkretnym przypadku to po prostu tworzy (31 = 0x1F):

~0x1F = 0xFFFFFFE0 

Jest on używany z bitwise and (&) a więc bascially to anuluje ostatnie 5 bitów.

0

~ 31 = bitowe negacja 31 i w tym konkretnym przypadku jest używany do utrzymywania na zero pierwszy (od LSB) 5 bitów (Width * Planes * BitCount + 31)

7

włączeniu do poręcznej kopią ISO/IEC 23270:2006 — Information technology — Programming languages — C# i skręcić § 14.6. 4 świętego zapisu. Nie znajdziesz:


14.6.4 bitowe operatora uzupełnieniem

Dla operacji formularza ~ x, rozdzielczość przeciążenie operator jednoargumentowy (§14.2.3) stosowana jest, aby wybrać określoną operatora realizacja. Operand jest konwertowany na typ parametru wybranego operatora, a typ wyniku jest typem zwracanym przez operatora. Predefiniowane operatory dopełnienia bitowego to:

int operator ~(int x) ; 
uint operator ~(uint x) ; 
long operator ~(long x) ; 
ulong operator ~(ulong x) ; 

Dla każdego z tych operatorów wynikiem operacji jest bitowe uzupełnienie x.

Każdy rodzaj wyliczenie E domyślnie udostępnia następujące operatory bitowe dopełniacza:

E operator ~(E x); 

Wynikiem oceny ~x, gdzie x jest wyrazem typu wyliczenia E z bazowego typu U, jest dokładnie taka sama jak oceniając unchecked((E)(~(U)x)). Ten operator jest brany pod uwagę tylko przez jednooperacyjną rozdzielczość przeciążania operatora, gdy typem operacji jest wyliczenie typu E (§14.2.3).

Zniesione (§ 14.2.7) formy uprzednio podnoszonych predefiniowanych operatorów uzupełnień bitowych zdefiniowanych powyżej również są wstępnie zdefiniowane.


W twoim przypadku ~31 jest taka sama jak ~ 0x0000001F. Bitowalny komponent 0x0000001F jest 0xFFFFFFE0. Dlaczego po prostu nie napisali, że prawdziwa maska, której chcieli, jest poza mną.