نکاتی دربارهٔ اپراتورهای بیتی (Bitwise Operators)

اپراتور XOR

۱. از اپراتور XOR می‌توان برای معکوس کردن یک یا چند بیت مشخص استفاده کرد. بعنوان مثال:
الف) می‌خواهیم بیت‌های دوم، پنجم و هفتم عدد 11101100110 (1894) را معکوس کنیم. باید این عدد را با 1010010 (82)، XOR کنیم. عدد حاصل برابر 11100110100 (1844) می‌شود. بنابراین هرگاه خواستید بیت‌های دوم، پنجم و هفتم یک عدد را معکوس کنید، آن عدد را با 82، XOR کنید.
ب) می‌خواهیم بیت‌های دوم، پنجم و ششم عدد 1011100 (92) را معکوس کنیم. باید این عدد را با 110010 (50)، XOR کنیم. عدد حاصل برابر 1101110 (110) می‌شود. بنابراین هرگاه خواستید بیت‌های دوم، پنجم و ششم یک عدد را معکوس کنید، آن عدد را با 50، XOR کنید.
ج) می‌خواهیم بیت‌های فرد عدد 1001000111 (583) را معکوس کنیم. باید این عدد را با 101010101 (341)، XOR کنیم. عدد حاصل برابر 1100010010 (786) می‌شود.

۲. XOR هر عدد با صفر برابر همان عدد می‌شود.

۳. XOR هر عدد با خودش برابر صفر می‌شود. از این خاصیت می‌توان برای بررسیِ برابر بودن دو داده استفاده کرد. همچنین می‌توان برای صفر کردن یک داده نیز از این خاصیت استفاده نمود.

#include <stdio.h>

int main()
{
    int a = 39, b = 39;

    if(a ^ b)
        printf("a is not equal to b.\n");
    else
        printf("a is equal to b.\n");

    return 0;
}
#include <stdio.h>

int main()
{
    int a = 39;

    printf("%d\n", a);
    a ^= a;
    printf("%d\n", a);

    return 0;
}

۴. اگر یک عدد، دو مرتبه با یک عدد مشخص XOR شود، حاصل همان عدد اول می‌شود. از این خاصیت می‌توان برای Encode و Decode اطلاعات استفاده کرد. همچنین می‌توان برای Swap داده‌ها هم از این خاصیت استفاده نمود (مثال‌هایی از آن در این صفحه و این صفحه آورده شده است).

۵. XOR هر عدد زوج با یک، یک واحد به آن اضاف می‌شود و XOR هر عدد فرد با یک، یک واحد از آن کم می‌شود.

۶. از اپراتور XOR می‌توان برای جمع بین دو بیت استفاده کرد؛ یعنی:

0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 0 // (Carry will be generated by AND)

اپراتور AND

۱. AND هر عدد با صفر برابر صفر می‌شود.

۲. AND هر عدد با خودش برابر همان عدد می‌شود.

۳. AND هر عدد با معکوس خودش برابر صفر می‌شود.

#include <stdio.h>

int main()
{
    int a = 39;

    printf("%d\n", a);
    a &= ~a;
    printf("%d\n", a);

    return 0;
}

۴. AND‌ هر عدد با یک برابر صفر یا یک می‌شود. از این خاصیت می‌توان برای مشخص کردن زوج یا فرد بودن یک عدد استفاده کرد (قبلا توضیحاتی دربارهٔ آن در این صفحه داده شده است).

#include <stdio.h>

int main()
{
    int num;
    scanf("%d", &num);

    if(num & 1)
        printf("The number %d is ODD.\n", num);
    else
        printf("The number %d is EVEN.\n", num);

    return 0;
}

۵. از اپراتور AND‌ می‌توان برای بدست آوردن Carry استفاده کرد؛ یعنی:

1 + 1 = 0 // Generates carry (1)

اپراتور OR

۱. OR هر عدد با صفر برابر همان عدد می‌شود.

۲. OR هر عدد با خودش برابر همان عدد می‌شود.

۳. هیچگاه حاصلِ OR دو عدد، کوچک‌تر از عدد بزرگتر نمی‌شود. حاصل همواره بیشتر یا مساوی با عدد بزرگتر است.

اپراتور NOT

NOT یک اپراتور نقیض یا مکمل یک می‌باشد و جای یک‌ها را با صفر و صفرها را با یک عوض می‌کند. به یاد داشته باشید که اعداد علامت‌دار بصورت مکمل دو ذخیره می‌شوند. پس وقتی با اپراتور NOT بیت‌ها را معکوس می‌کنیم (یعنی مکمل یک می‌گیریم)، این عدد بصورت مکمل دو ذخیره می‌شود و به نمایش گذاشته خواهد شد. بدین ترتیب دیگر دو نمایش صفر (صفر مثبت و صفر منفی) وجود ندارد و برخی از عملیات‌ها در سخت‌افزار، راحت‌تر انجام می‌شود.

برای تبدیل تمام بیت‌های یک نوع دادهٔ مشخص به یک، می‌توان NOT آن عدد را با خود آن عدد XOR یا OR یا جمع کرد؛ و یا آن داده را برابر NOT عدد صفر (0~) قرار داد؛ و یا آن دادهٔ علامت‌دار را برابر 1- قرار داد.

n ^= ~n;
n |= ~n;
n += ~n;
n = ~0;
n = -1;

اپراتورهای Left Shift و Right Shift

از اپراتور >> (Shift-to-left)، برای جابجایی بیت‌ها به سمت چپ استفاده می‌شود. فضای خالی ایجاد شده توسط صفر پر می‌شود. از این اپراتور می‌توان برای ضرب یک عدد صحیح در توانی از 2 استفاده کرد.

از اپراتور<< (Shift-to-right)، برای جابجایی بیت‌ها به سمت راست استفاده می‌شود. فضای خالی ایجاد شده توسط صفر پر می‌شود. از این اپراتور می‌توان برای تقسیم یک عدد صحیح بر توانی از 2 استفاده کرد.