Операции надбитами
x<<n
|
Сдвиг
влеводвоичного
кода
(умножение на2n)
|
int
x=7; x=x<<2; // x=111<<2=100
|
x>>n
|
Сдвиг
вправо двоичного кода
(деление
на 2n
|
x>>1;
100>>1=010
|
x
& maska
|
Поразрядное
И (запись в бит 0)
|
111
& 100 =100
short
maska=0x1F; short int x=0xFFFFFFFF;
x
& maska (0x0000001F)
|
X
|maska
|
Поразрядное
ИЛИ (запись в бит 1)
|
111
| 100 =111
short
maska=0x1F; short int x=0xFFFFFF00;
x
& maska (0xFFFFFF1F)
|
X
^maska
|
Исключающее
ИЛИ для
поразрядных
операций
|
.unsigned
int x=0xF, a=1;
A=x^a;
1111 ^ 0001=1110
|
~
|
инверсия
|
x=0x0F;
~x (F0)
|
Пример.
Инвертирование маски перед умножением.
Установить пятый бит в 0
int_tmain(intargc,
_TCHAR* argv[])
{
unsigned
charx=255;
unsigned
charmaska=0x01; //1=00000001
x=x&(~
(maska<<4));
cout<<(int)x; //результат239cin.get();
return0;
}
Задания
Напишите
выражение, которое решаетзадачу
-
Установить 7 бит в 1.
3 Памелу Зейв
Какую
задачу реализует код функции?voidcoutp(unsigned
intx)
{
intn=sizeof(int)*8;unsignedmaska=(1<<n-1);
for(inti=1;
i<=n;i++)
{
cout<<((x&maska)>>(n-i));
maska=maska>>1;
}}
Определите
задачи, которые решают функции: set, clr,
test #define BITSPERWORD32
#define
SHIFT 5
#define
maska 0x1F #define N 10000000
int
a[1+N/ BITSPERWORD];
void
set(int i){ a[i>> SHIFT] |=(1<<(I & MASK));} void clr
(int i){ a[i>> SHIFT] &=(1<<(I & MASK));}
int
test (int i) { return a[i>> SHIFT] &(1<<(I &
MASK));}
Реализацияалгоритма