Rzeczywiste przypadki użycia operatorów bitowych [zamknięte]

Jakie są rzeczywiste przypadki użycia następujących operatorów bitowych?

  • i
  • XOR
  • NIE
  • lub
Author: ChaosPandion, 2010-01-19

30 answers

  • Pola bitowe (flagi)
    Są najskuteczniejszym sposobem przedstawiania czegoś, którego stan jest zdefiniowany przez kilka właściwości "tak lub nie". ACL są dobrym przykładem; jeśli masz powiedzmy 4 dyskretne uprawnienia (read, write, execute, change policy), lepiej przechowywać je w 1 bajcie, niż marnować 4. Dla większej wygody można je odwzorować na typy wyliczeń w wielu językach.

  • Komunikacja przez porty / gniazda
    Zawsze obejmuje sumy kontrolne, parzystość, bity stopu, algorytmy sterowania przepływem i tak dalej, które zwykle zależą od wartości logicznych poszczególnych bajtów w przeciwieństwie do wartości liczbowych, ponieważ medium może być w stanie transmitować tylko jeden bit na raz.

  • Kompresja, Szyfrowanie
    Oba są w dużym stopniu zależne od algorytmów bitowych. Spójrz na przykładowy algorytm deflate - Wszystko jest w bitach, nie bajtach.

  • Stan Skończony Maszyny
    Mówię przede wszystkim o rodzaju osadzonych w jakimś sprzęcie, choć można je również znaleźć w oprogramowaniu. Mają one charakter kombinatoryczny - mogą być dosłownie "skompilowane" do kilku bram logicznych, więc muszą być wyrażone jako AND, OR, NOT, itd.

  • Grafika Nie ma tu wystarczająco dużo miejsca, aby dostać się do każdego obszaru, w którym te operatory są używane w programowaniu Grafiki. XOR (lub ^) jest szczególnie interesujące, ponieważ zastosowanie tego samego wejścia po raz drugi spowoduje cofnięcie pierwszego. Starsze GUI polegały na tym do podświetlania selekcji i innych nakładek, aby wyeliminować potrzebę kosztownych przerysowań. Nadal są przydatne w wolnych protokołach graficznych(np. zdalnym pulpicie).

To tylko kilka pierwszych przykładów, które wymyśliłem - to nie jest wyczerpująca lista.

 189
Author: Aaronaught,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-19 23:34:40

Czy to dziwne?

(value & 0x1) > 0

Jest podzielna przez dwa (parzyste)?

(value & 0x1) == 0
 40
Author: Seth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-19 23:49:33

Dobrym przykładem jest programowanie niskopoziomowe. Można na przykład napisać określony bit do rejestru mapowanego pamięcią, aby jakiś sprzęt zrobił to, co chcesz:

volatile uint32_t *register = (volatile uint32_t *)0x87000000;
uint32_t          value;
uint32_t          set_bit   = 0x00010000;
uint32_t          clear_bit = 0x00001000;

value = *register;            // get current value from the register
value = value & ~clear_bit;   // clear a bit
value = value | set_bit;      // set a bit
*register = value;            // write it back to the register

Ponadto, htonl() i htons() są zaimplementowane przy użyciu operatorów & i | (na maszynach, których endianness (kolejność bajtów) nie pasuje do kolejności sieci):

#define htons(a) ((((a) & 0xff00) >> 8) | \
                  (((a) & 0x00ff) << 8))

#define htonl(a) ((((a) & 0xff000000) >> 24) | \
                  (((a) & 0x00ff0000) >>  8) | \
                  (((a) & 0x0000ff00) <<  8) | \
                  (((a) & 0x000000ff) << 24))
 21
Author: Carl Norum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-09 12:10:24

Używam ich, aby uzyskać wartości RGB(A) Z zapakowanych wartości kolorów, na przykład.

 20
Author: Terje,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-19 20:51:07

Oto kilka typowych idiomów zajmujących się flagami przechowywanymi jako pojedyncze bity.

enum CDRIndicators {
  Local = 1 << 0,
  External = 1 << 1,
  CallerIDMissing = 1 << 2,
  Chargeable = 1 << 3
};

unsigned int flags = 0;

Ustaw flagę obciążającą:

flags |= Chargeable;

Wyczyść flagę CallerIDMissing:

flags &= ~CallerIDMissing;

Sprawdź, czy CallerIDMissing i Chargeable są ustawione:

if((flags & (CallerIDMissing | Chargeable )) == (CallerIDMissing | Chargeable)) {

}
 19
Author: nos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-25 13:32:04

Wykorzystałem operacje bitowe przy implementacji modelu bezpieczeństwa dla CMS. Miał strony, do których użytkownicy mogli uzyskać dostęp, jeśli byli w odpowiednich grupach. Użytkownik może być w wielu grupach, więc musieliśmy sprawdzić, czy istnieje przecięcie między grupami użytkowników i grupami stron. Przypisaliśmy więc każdej grupie unikalny identyfikator power-of-2, np.:

Group A = 1 --> 00000001
Group B = 2 --> 00000010
Group C = 3 --> 00000100

We lub te wartości razem i zapisać wartość (jako pojedynczą int) ze stroną. Np. jeśli strona może być dostępna przez grupy A i B, zapisujemy wartość 3 (która w binarnym to 00000011) jako kontrolę dostępu do stron. W podobny sposób przechowujemy wartość identyfikatorów grup ORed u użytkownika, aby reprezentować grupy, w których się znajdują.

Więc aby sprawdzić, czy dany użytkownik może uzyskać dostęp do danej strony, wystarczy i wartości razem i sprawdzić, czy wartość jest niezerowa. Jest to bardzo szybkie, ponieważ ta kontrola jest zaimplementowana w jednej instrukcji, bez pętli, bez podróży w obie strony bazy danych.

 17
Author: JonoW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-19 21:59:19

Kiedy mam kilka flag logicznych, Lubię przechowywać je wszystkie w int.

Wyciągam je za pomocą bitwise-AND. Na przykład:

int flags;
if (flags & 0x10) {
  // Turn this feature on.
}

if (flags & 0x08) {
  // Turn a second feature on.
}

Itd.

 15
Author: Tenner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-25 13:33:06

Szyfrowanie to wszystkie operacje bitowe.

 10
Author: recursive,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-19 20:51:27

& = AND:
Zamaskuj konkretne kawałki.
Definiujesz konkretne bity, które powinny być wyświetlane lub nie wyświetlane. 0x0 & x wyczyści wszystkie bity w bajcie, podczas gdy 0xFF nie zmieni x. 0x0F wyświetli bity w dolnej części.

Konwersja:
Aby dodać krótsze zmienne do dłuższych o tożsamości bitowej, konieczne jest dostosowanie bitów, ponieważ -1 W int wynosi 0xffffffffffffffffffffff. Aby zachować tożsamość, po której nakładasz maskę nawrócenie.

/ = LUB
Zestaw bitów. Bity zostaną ustawione niezależnie, jeśli są już ustawione. Wiele struktur danych (bitfieldów) ma flagi takie jak IS_HSET = 0, IS_VSET = 1, które można ustawiać samodzielnie. Aby ustawić flagi, należy zastosować IS_HSET / IS_VSET (w C i assembly jest to bardzo wygodne do odczytu)

^ = XOR
Znajdź bity, które są takie same lub różne.

~= nie
Odwróć bity.

Można wykazać, że wszystkie możliwe lokalne operacje bitowe mogą być zaimplementowane przez tych operacji. Więc jeśli chcesz, możesz zaimplementować instrukcję ADD wyłącznie za pomocą operacji bitowych.

Kilka wspaniałych hacków:

Http://www.ugcs.caltech.edu/~wnoise/base2.html
http://www.jjj.de/bitwizardry/bitwizardrypage.html

 9
Author: Thorsten S.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-19 23:01:07

Użyłem bitowego-XOR (^) około trzy minuty temu, aby obliczyć sumę kontrolną dla komunikacji szeregowej ze sterownikiem PLC...

 8
Author: ezod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-19 20:49:36

Możesz ich używać jako szybkiego i brudnego sposobu na hashowanie danych.

int a = 1230123;
int b = 1234555;
int c = 5865683;
int hash = a ^ b ^ c;
 8
Author: ChaosPandion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-19 20:50:45

Bitowe & jest używane do maskowania / wyodrębniania pewnej części bajtu.

1 zmienna bajtowa

 01110010
&00001111 Bitmask of 0x0F to find out the lower nibble
 --------
 00000010

W szczególności operator zmiany (>) jest często używany do obliczeń.

 6
Author: DrDol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-19 20:53:17

Jest to przykład odczytu kolorów z obrazu bitmapowego w formacie bajtów

byte imagePixel = 0xCCDDEE; /* Image in RRGGBB format R=Red, G=Green, B=Blue */

//To only have red
byte redColour = imagePixel & 0xFF0000; /*Bitmasking with AND operator */

//Now, we only want red colour
redColour = (redColour >> 24) & 0xFF;  /* This now returns a red colour between 0x00 and 0xFF.
Mam nadzieję, że te małe przykłady pomogą....
 5
Author: Buhake Sindi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-20 04:24:58

Kodowanie Base64 jest przykładem. Kodowanie Base64 jest używane do reprezentowania danych binarnych jako drukowalnych znaków do wysyłania przez systemy poczty elektronicznej (i innych celów). Kodowanie Base64 konwertuje serię 8-bitowych bajtów na 6-bitowe indeksy wyszukiwania znaków. Operacje bitowe, przesuwanie i 'ING lub' ING, nie ' ING są bardzo przydatne do implementacji operacji bitowych niezbędnych do kodowania i dekodowania Base64.

To oczywiście tylko jeden z niezliczonych przykładów.

 4
Author: rayd09,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-19 20:51:32

Jestem zaskoczony, że nikt nie wybrał oczywistej odpowiedzi na wiek Internetu. Obliczanie poprawnych adresów sieciowych dla podsieci.

Http://www.topwebhosts.org/tools/netmask.php

 4
Author: Bill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-19 22:46:18

W abstrakcyjnym świecie współczesnego języka, nie jest zbyt wiele. File IO jest łatwy, który przychodzi na myśl, choć to wykonywanie operacji bitowych na czymś już zaimplementowanym i nie implementuje czegoś, co używa operacji bitowych. Mimo to, jako prosty przykład, kod ten demonstruje usunięcie atrybutu Tylko do odczytu z pliku (aby mógł być używany z nowym strumieniem plików określającym Kod pliku.Create) w c#:

//Hidden files posses some extra attibutes that make the FileStream throw an exception
//even with FileMode.Create (if exists -> overwrite) so delete it and don't worry about it!
if(File.Exists(targetName))
{
    FileAttributes attributes = File.GetAttributes(targetName);

    if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
        File.SetAttributes(targetName, attributes & (~FileAttributes.ReadOnly));

    File.Delete(targetName);
}

Jeśli chodzi o niestandardowe implementacje, oto ostatni przykład: Stworzyłem "Centrum Wiadomości" do wysyłania bezpiecznych wiadomości z jednej instalacji naszej rozproszonej aplikacji do drugiej. Zasadniczo jest analogiczny do poczty e-mail, wraz z skrzynką odbiorczą, skrzynką nadawczą, wysłaną itp., ale ma również gwarantowaną dostawę z paragonami odczytu, więc istnieją dodatkowe podfoldery poza "skrzynką odbiorczą" i "wysłaną."To, co to było, było dla mnie wymogiem ogólnego zdefiniowania, co jest" w skrzynce odbiorczej "lub co jest"w folderze wysłanym". Z wysłanego folderu, muszę wiedzieć co przeczytane, a co nieprzeczytane. Z tego, co jest nieprzeczytane, muszę wiedzieć, co zostało odebrane, a co nie. Używam tych informacji do budowania dynamicznej klauzuli where, która filtruje lokalne źródło danych i wyświetla odpowiednie informacje.

Oto jak się składa enum:

    public enum MemoView :int
    {
        InboundMemos = 1,                   //     0000 0001
        InboundMemosForMyOrders = 3,        //     0000 0011
        SentMemosAll = 16,                  //     0001 0000
        SentMemosNotReceived = 48,          //     0011
        SentMemosReceivedNotRead = 80,      //     0101
        SentMemosRead = 144,                //     1001
        Outbox = 272,                       //0001 0001 0000
        OutBoxErrors = 784                  //0011 0001 0000
    }
Widzisz, do czego to służy? Przez anding ( & ) z wartością "Inbox" enum, InboundMemos, wiem, że InboundMemosForMyOrders jest w skrzynce odbiorczej.

Oto skrócona wersja metody tworzy i zwraca filtr definiujący widok dla aktualnie wybranego folderu:

    private string GetFilterForView(MemoView view, DefaultableBoolean readOnly)
    {
        string filter = string.Empty;
        if((view & MemoView.InboundMemos) == MemoView.InboundMemos)
        {
            filter = "<inbox filter conditions>";

            if((view & MemoView.InboundMemosForMyOrders) == MemoView.InboundMemosForMyOrders)
            {
                filter += "<my memo filter conditions>";
            }
        }
        else if((view & MemoView.SentMemosAll) == MemoView.SentMemosAll)
        {
            //all sent items have originating system = to local
            filter = "<memos leaving current system>";

            if((view & MemoView.Outbox) == MemoView.Outbox)
            {
                ...
            }
            else
            {
                //sent sub folders
                filter += "<all sent items>";

                if((view & MemoView.SentMemosNotReceived) == MemoView.SentMemosNotReceived)
                {
                    if((view & MemoView.SentMemosReceivedNotRead) == MemoView.SentMemosReceivedNotRead)
                    {
                        filter += "<not received and not read conditions>";
                    }
                    else
                        filter += "<received and not read conditions>";
                }
            }
        }

        return filter;
    }

Niezwykle prosta, ale zgrabna implementacja na poziomie abstrakcji, która zazwyczaj nie wymaga operacji bitowych.

 4
Author: Fred,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-25 13:33:53

Wydaje się, że nikt nie wspomniał o matematyce punktów stałych.

(Tak, jestem stary, ok?)

 3
Author: Jason Williams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-19 23:32:49

Operatory bitowe są przydatne do zapętlania tablic, których długość jest potęgą 2. Jak wiele osób wspomniało, operatory bitowe są niezwykle przydatne i są używane w flagach , grafika, Networking, Szyfrowanie . Nie tylko to, ale są niezwykle szybkie. Moim ulubionym zastosowaniem jest loopan arrayBEZ conditionals. Załóżmy, że macie tablicę opartą na indeksie zerowym (np. indeks pierwszego elementu wynosi 0) i trzeba go zapętlić w nieskończoność. W nieskończoność mam na myśli przechodzenie od pierwszego elementu do ostatniego i powrót do pierwszego. Jednym ze sposobów realizacji tego jest:

int[] arr = new int[8];
int i = 0;
while (true) {
    print(arr[i]);
    i = i + 1;
    if (i >= arr.length) 
        i = 0;
}

Jest to najprostsze podejście, jeśli chcesz uniknąć if , możesz użyć Moduł podejścia w następujący sposób:

int[] arr = new int[8];
int i = 0;
while (true) {
    print(arr[i]);
    i = i + 1;
    i = i % arr.length;
}

Dół tych dwóch metod polega na tym, że operator modułu jest drogi, ponieważ szuka reszty po podziale całkowitym. I pierwsza metoda uruchamia if Oświadczenie o każda iteracja. Z operatorem bitowym jednak jeśli długość tablicy jest potęgą 2, możesz łatwo wygenerować sekwencję podobną do 0 .. length - 1 za pomocą & (bitwise and) operator taki jak so i & length. Więc wiedząc o tym, kod z góry staje się

int[] arr = new int[8];
int i = 0;
while (true){
    print(arr[i]);
    i = i + 1;
    i = i & (arr.length - 1);
}
Oto jak to działa. W formacie binarnym każda liczba, która jest potęgą 2 odejmowaną przez 1, wyraża się tylko jedynkami. Na przykład 3 w binarnym to 11, 7 to 111, 15 to 1111 i tak dalej, masz pomysł. Teraz, co się stanie, jeśli & jakaś liczba przeciwko liczbie składającej się tylko z jedynek w binarnym? Powiedzmy, że zrobimy to:
num & 7;

Jeśli num jest mniejszy lub równy 7, to wynik będzie num, ponieważ każdy bit & - ed z 1 jest sobą. Jeśli num jest większe niż 7, podczas operacji & komputer weźmie pod uwagę początkowe zera 7, które oczywiście pozostaną jako zera po operacji & pozostanie tylko końcowa część. Podobnie jak w przypadku 9 & 7 w pliku binarnym będzie to wyglądać

1001 & 0111

Wynik będzie 0001 który jest 1 w dziesiętnym i adresuje drugi element w tablicy.

 3
Author: user3552161,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-25 13:52:36

Zwykle operacje bitowe są szybsze niż mnożenie/dzielenie. Więc jeśli chcesz pomnożyć zmienną x przez powiedzmy 9, wykonasz x<<3 + x, co byłoby o kilka cykli szybciej niż x*9. Jeśli ten kod znajduje się wewnątrz ISR, zaoszczędzisz czas odpowiedzi.

Podobnie, jeśli chcesz użyć tablicy jako okrągłej kolejki, szybsze (i bardziej eleganckie) byłoby obsługiwanie kontroli zawijania za pomocą bitowych operacji. (rozmiar tablicy powinien wynosić 2). Np:, możesz użyć tail = ((tail & MASK) + 1) zamiast tail = ((tail +1) < size) ? tail+1 : 0, Jeśli chcesz wstawić / usunąć.

Również jeśli chcesz, aby flaga błędu zawierała wiele kodów błędów razem, każdy bit może zawierać oddzielną wartość. Możesz i to z każdym indywidualnym kodem błędu jako czekiem. Jest to używane w Unixowych kodach błędów.

Również N-bitowa bitmapa może być naprawdę fajną i zwartą strukturą danych. Jeśli chcesz przydzielić pulę zasobów o rozmiarze n, możemy użyć n-bitów do reprezentowania bieżącego stanu.

 3
Author: user3382203,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-25 13:53:34

Używam ich do wielu opcji wyboru, w ten sposób przechowuję tylko jedną wartość zamiast 10 lub więcej

 2
Author: SQLMenace,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-19 20:48:11

Może być również przydatny w modelu relacyjnym sql, powiedzmy, że masz następujące tabele: BlogEntry, BlogCategory

Tradycyjnie można utworzyć relację n-n między nimi za pomocą tabeli BlogEntryCategory lub gdy nie ma zbyt wielu rekordów kategorii blogów, możesz użyć jednej wartości w BlogEntry, aby połączyć się z wieloma rekordami kategorii blogów, tak jak to zrobisz z oznaczonymi enumami, w większości RDBMS są również bardzo szybkie operatory do wyboru w kolumnie "oznaczonej"...

 2
Author: Tim Mahy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-19 21:28:27

Czy liczba x jest potęgą 2? (Przydatne na przykład w algorytmach, w których licznik jest zwiększany, a działanie ma być wykonane tylko logarytmicznie liczba razy)

(x & (x - 1)) == 0

Który jest najwyższym bitem liczby całkowitej x? (To na przykład może być użyte, aby znaleźć minimalną moc 2, która jest większa niż x)

x |= (x >>  1);
x |= (x >>  2);
x |= (x >>  4);
x |= (x >>  8);
x |= (x >> 16);
return x - (x >>> 1); // ">>>" is unsigned right shift

Który jest najniższym 1 bitem liczby całkowitej x? (Pomaga znaleźć liczbę razy podzielną przez 2.)

x & -x
 2
Author: Dimitris Andreou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-20 01:42:14

Jeśli chcesz zmienić tylko niektóre bity wyjść mikrokontrolera, ale rejestr do zapisu jest bajtem, robisz coś takiego (pseudocode):

char newOut = OutRegister & 0b00011111 //clear 3 msb's
newOut = newOut | 0b10100000 //write '101' to the 3 msb's
OutRegister = newOut //Update Outputs

Oczywiście wiele mikrokontrolerów pozwala na zmianę każdego bitu z osobna...

 2
Author: Emilio M Bumachar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-22 19:59:14

Jeśli kiedykolwiek chcesz obliczyć swoją liczbę mod (%) pewną moc 2, możesz użyć yourNumber & 2^N-1, która w tym przypadku jest taka sama jak yourNumber % 2^N.

number % 16 = number & 15;
number % 128 = number & 127;

Jest to prawdopodobnie tylko przydatne jako alternatywa dla operacji modułowych z bardzo dużą dywidendą, która wynosi 2^N... Ale nawet wtedy jego wzrost prędkości nad działaniem modułu jest znikomy w moim teście na. Net 2.0. Podejrzewam, że współczesne Kompilatory już wykonują takie optymalizacje. Ktoś wie coś więcej na ten temat?

 2
Author: Dan7,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-27 16:12:17

Widziałem je używane w systemach kontroli dostępu opartych na rolach.

 1
Author: ScottE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-19 20:56:33

W moim pytaniu jest użyteczny Świat-
odpowiadasz tylko na pierwsze powiadomienie WM_KEYDOWN?

Podczas używania komunikatu WM_KEYDOWN w bit 30 interfejsu api windows C określa poprzedni stan klucza. Wartość jest równa 1, Jeśli klucz jest w dół przed wysłaniem wiadomości, lub jest równa zero, jeśli klucz jest w górę

 1
Author: Nick Van Brunt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:03:04

Są one najczęściej używane do operacji bitowych (niespodzianka). Oto kilka rzeczywistych przykładów znalezionych w bazie kodu PHP.

Kodowanie znaków:

if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_KOI8R) {

Struktury Danych:

ar_flags = other->ar_flags & ~SPL_ARRAY_INT_MASK;

Sterowniki bazy danych:

dbh->transaction_flags &= ~(PDO_TRANS_ACCESS_MODE^PDO_TRANS_READONLY);

Implementacja kompilatora:

opline->extended_value = (opline->extended_value & ~ZEND_FETCH_CLASS_MASK) | ZEND_FETCH_CLASS_INTERFACE;
 1
Author: Constantin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-19 21:21:04

Za każdym razem, gdy zaczynałem programowanie w C, rozumiałem tabele prawdy i takie tam, ale nie wszystko klikało z tym, jak właściwie z niego korzystać, dopóki nie przeczytałem tego artykułu http://www.gamedev.net/reference/articles/article1563.asp (co daje prawdziwe przykłady życia)

 1
Author: Earlz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-19 21:51:18

Nie wydaje mi się, że to liczy się jako bitowe, ale tablica ruby definiuje operacje set poprzez normalne operatory bitowe. Więc [1,2,4] & [1,2,3] # => [1,2]. Podobnie dla a ^ b #=> set difference i a | b #=> union.

 1
Author: Tim Snowhite,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-19 22:40:34

Rozwiązanie liniowe Tower Of Hanoi wykorzystuje operacje bitowe do rozwiązania problemu.

public static void linear(char start, char temp, char end, int discs)
{
    int from,to;
    for (int i = 1; i < (1 << discs); i++) {
        from = (i & i-1) % 3;
        to = ((i | i-1) + 1) % 3;
        System.out.println(from+" => "+to);
    }
}

Wyjaśnienie tego rozwiązania można znaleźć tutaj

 1
Author: Dungeon Hunter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:03:04