Другие языки программирования и технологии

Битовые операции

1.Где мне могут понадобится битовые операции (си) ? Зачем нужен |, если есть &? Можете привести ссылку на какую нибудь задачу? ума не приложу где они могут понадобится... .
2.Можно ли упаковать несколько маленьких переменных (напр. по 2) в один байт?
1) Мне один раз пришлось работать с & и | для перевода цветного изображения в черно-белое. Правда не на Си, но примерный код в Си будет выглядеть так:

//Получение диапазонов цветов RGB из 0xFFFFFF в (255,255,255) и обратно.
    #include <stdio.h>
    #include <conio.h>

    int main() {
        int rgb = 0xFFAAEE, red, green, blue;
            red = (rgb&0xFF0000)>>16;
            green = (rgb&0x00FF00)>>8;
            blue = (rgb&0x0000FF);
        printf("Color Set: R %d,G %d,B %d",red,green,blue);

        int getrgb = red<<16 | green<<8 | blue;
        printf("\nColor RGB: %x", getrgb);
        _getch();
        return 0;
    }


Так же смотри битовые поля, там эти операции употребляются.
Адилет Камчыбеков
Адилет Камчыбеков
40 015
Лучший ответ
>Где мне могут понадобится битовые операции (си) ?
Везде, где используются битовые маски и флаги.
>Зачем нужен |, если есть &?
То есть как? Это не взаимозаменимые операнды.
>Можете привести ссылку на какую нибудь задачу?
Возведение 2 в произвольную целую степень.
>ума не приложу где они могут понадобится.. .
Это от отсутствия опыта. .

>Можно ли упаковать несколько маленьких переменных (напр. по 2) в один байт?
Можно, пример - та самая битовая маска.
> Можно ли упаковать несколько маленьких переменных (напр. по 2) в один байт?
Структура: a - 4 бита, b - 1, c - 3

#include <stdio.h>

int main() {
struct {
unsigned char a: 4;
unsigned char b: 1;
unsigned char c: 3;
} pack;

pack.a = 3;
pack.b = 1;
pack.c = 5;

pack.a++;
pack.b++;
pack.c++;

printf("a: %d, b: %d, c: %d\n", pack.a, pack.b, pack.c);

return 0;
}
1. Погугли. | - сложение соответствующих разрядов, & - умножение.
2. По мне - бред.
2. Нельзя упаковать несколько переменных в 1 байт. Пусть целочисленная переменная "заняла" n бит и пусть n < 8. Тогда максимальное значение этой переменной не превысит 2^n. На самом деле, эта переменная заняла 1 байт. Это можно проверить операцией sizeof.
Юрий Новичков
Юрий Новичков
1 069