1. ~ Побитовое Не - инверсия битов Применяется к каждому биту нашего числа и меняет его значение на противоположное: нули — на единицы, единицы — на нули. ...001010 - число 10 в двоичной системе ...110101 - результат выражения ~10 отрицательное число = -11 ( -(10+1) ) Отрицательные числа представлены дополнительным кодом, который определяется так: ~Положительное число + 1 Такой алгоритм применяется чтобы можно было заменить вычитание сложением, например, чтобы -5 + 5 стало = 0 Пример программы: static void Main(string[] args) { int n = 10; Console.WriteLine(~n + " " + Convert.ToString(~n, 2)); Console.ReadLine(); } 2. & Побитовое И Побитовый & работает схожим образом с функцией И: он также сравнивает два числа, но только по битам. Результатом этого сравнения является третье число. 101010 &110011 =100010 Пример программы: static void Main(string[] args) { int a = 0b101010; int b = 0b110011; Console.WriteLine(Convert.ToString(a&b, 2)); Console.ReadLine(); } 3. | Побитовое ИЛИ Принцип работы тот же — выполняем логическое ИЛИ для соответствующих битов. Если хотя бы один из битов равен 1, результат будет равен 1. 101010 |110011 =111011 4. ^ Побитовое исключающее ИЛИ Похож на побитовое ИЛИ, но с одним исключением, если оба биты будут = 1. результат будет = 0. Результат =1, если только один из операндов 1. 101010 |110011 =011001 5. << Сдвиг влево Операция вида x << y означает сдвинуть на y битов влево число x 9<<3 это сдвинуть на 3 бита влево двоичное представление числа 9 9 = 1001 9<<3 = 1001000 При каждом сдвиге влево выполняется умножение числа на 2. 9<<3 = 9*2*2*2=72 5. >> Сдвиг вправо То же самое, только в другую сторону :) При каждом сдвиге вправо выполняется деление на два с отбрасыванием любого остатка. 35 >> 2 = 8 6. Установка бита |Маска static void Main(string[] args) { int userAccess = 0; const int READ = 1; const int WRITE = 2; const int EXECUTE = 4; userAccess = userAccess | READ | EXECUTE; Console.WriteLine(userAccess); Console.ReadLine(); } 7. Проверка установки бита &Маска static void Main(string[] args) { int userAccess = 0; const int READ = 1; const int WRITE = 2; const int EXECUTE = 4; userAccess = userAccess | READ | EXECUTE; Console.WriteLine(userAccess); bool canRead = (userAccess & READ) == READ; Console.WriteLine(canRead); Console.ReadLine(); } 8. Снятие бита &~Маска static void Main(string[] args) { int userAccess = 0; const int READ = 1; const int WRITE = 2; const int EXECUTE = 4; userAccess = userAccess | READ | EXECUTE; Console.WriteLine(userAccess); userAccess = userAccess & ~READ; bool canRead = (userAccess & READ) == READ; Console.WriteLine(canRead); Console.ReadLine(); } 9. Снятие бита, если был установлен или установка, если не был установлен ^ static void Main(string[] args) { int userAccess = 0; const int READ = 1; const int WRITE = 2; const int EXECUTE = 4; userAccess = userAccess | READ | EXECUTE; Console.WriteLine(userAccess); userAccess = userAccess ^ READ; bool canRead = (userAccess & READ) == READ; Console.WriteLine(canRead); userAccess = userAccess ^ READ; canRead = (userAccess & READ) == READ; Console.WriteLine(canRead); Console.ReadLine(); } 10. Шифрование ^ Ключ = 7 Секрет = 8 Шифровка = Секрет^7 Расшифровка = Шифровка^7 11. "Упаковка" нескольких значений в одну переменную static void Main(string[] args) { int age, height, weight; age = 17; height = 178; weight = 70; int combined = 0; combined |= age; combined = combined << 8; combined |= height; combined = combined << 8; combined |= weight; Console.WriteLine(combined); int mask = 255; Console.WriteLine("age = " + (combined >> 16)); Console.WriteLine("height = " + ((combined >> 8) & mask)); Console.WriteLine("weight = " + (combined & mask)); Console.ReadLine(); }