* Побитови операции
Публикувано на 24 октомври 2008 от Филип Петров. Записано в C/C++.
Езикът С притежава част от качествата на асемблерните езици. Той разполага с пълен набор от операции за работа с отделни битове на числените стойности – поразредни операции. Тези операции позволяват проверяване, установяване или преместване на отделни битове на променливи от тип int или char. Поразредните операции се използват много често при писането на драйвери за устройства.
Всеки обект се разполага като двоично число в паметта. Определен брой байтове, в зависимост от конкретния компютър, определят „машинна дума“.
Поразредните операции се означават със следните символи:
1. & – поразредно логическо И:
1 & 1 = 1 0 & 0 = 0 0 & 1 = 0 1 & 0 = 0 Пример: 1 0 0 1 0 & 1 0 1 1 0 --------- 1 0 0 1 0
Изолзува се обикновено за нулиране на отделни битове в числената стойност на резултата. Ако някой бит в единия или другия операнд има нулева стойност, съответния по позиция бит в резултата също ще има нулева стойност.
2. | – поразредно логическо ИЛИ
1 | 1 = 1 1 | 0 = 1 0 | 1 = 1 0 | 0 = 0 Пример: 1 0 0 1 0 1 | 0 1 0 1 1 0 ----------- 1 1 0 1 1 1
Можем да разгледаме операцията като обратна на миналата – можем да направим отделни битове единици в резултата.
3. ^ – поразредно логическо ИЗКЛЮЧВАЩО ИЛИ (XOR)
1 ^ 1 = 0 1 ^ 0 = 1 0 ^ 1 = 1 0 ^ 0 = 0 Пример: 1 0 0 1 0 ^ 1 1 0 0 1 --------- 0 1 0 1 1
Определени битове в резултата се установяват като единица само когато съответните битове в операндите са различни.
4. ~ – поразредно логическо ДОПЪЛВАНЕ ДО 1
Това вече е едноместна операция с асоциативно правило на изпълнение отдясно наляво. Операнд може да бъде всеки валиден израз, имащ резултат цяла стойност. При изпълнението на операцията всеки бит на операнда се променя с обратната си стойност, т.е. 0 става 1, а 1 става 0. От това веднага следва, че двукратното изпълнение на операцията възстановява числото в първоначален вид.
Пример: ~11010101 --------- 00101010
5. >> – изместване вдясно
Това е двуоперандна операция. Първият операнд е валиден израз връщащ число, а вторият и брой битове, с които отместваме вдясно.
Пример: 01111000 >> 3 -------- 00001111
Ефектът от примера е, че все едно три пъти сме разделили числото на две. Например 120 >> 2 ще върне резултат 30 ((120/2)/2).
6. << – изместване вляво
Обратната операция на изместването вдясно.
Пример: 00001111 << 3 -------- 01111000
Ефектът също е обратния – все едно сме умножили числото три пъти по две. Например 15 << 3 ще върне резултат 120 (15*2*2*2).
При операциите изместване вляво или вдясно трябва да знаете, че изместените битове се губят. Следният пример го демонстрира:
00001111 >> 1 -------- 00000111 << 1 -------- 00001110
Затова резултатът от операциите е неопределен, ако броя битове е по-голям или равен на дължината на първия операнд.
6 коментара за “Побитови операции”
Пусни коментар
Страници
Категории
- C/C++ (45)
- DB (36)
- Dogs (49)
- Food (7)
- History (8)
- Java (33)
- Lada (41)
- Math (104)
- Metodos (23)
- NetSec (36)
- Other (76)
- Politics (32)
- Probability (13)
- VC++.Net (1)
- XHTML/JS (25)
Нови
- Един виц за капитализма
- Как да получиш целувка?
- Лека разходка на Витоша
- Роко и Берра на училище
- Газова бутилка под багажника на Лада Нива
16 март 2010 на 23:45
Много полезно като метод и служи перфектно за ускоряване на процеса на работа на програмите.
Но доколкото знам малко хора го учат като метод в университетите.
17 март 2010 на 13:28
Учи се, но „отгоре-отгоре“.
19 март 2010 на 21:20
Точно защото се учи „отгоре-отгоре“ сега ми трябва за една задача. Някой ако може да помага. Трябва да разменя стойностите на 2 променливи(които си задаваме) побитово без използването на 3-та променлива. плс пишете тук или на скайп: tzanev8989
19 март 2010 на 21:21
забравих да кажа ако може да е Java Код, но и C++ става
19 март 2010 на 21:53
Ето няколко варианта:
1: Чрез събиране и изваждане
a=a+b;
b=a-b;
a=a-b;
2: Чрез умножение и деление
a=a*b;
b=a/b;
a=a/b;
3: Чрез XOR (т.е. побитово)
x = x^y
y = x^y
x = x^y
20 март 2010 на 8:38
Благодаря много за бързият отговор