Форум программистов, компьютерный форум CyberForum.ru

Битовые операции (написать функцию для сброса в ноль двух битов с заданными номерами в коде символа) - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Программа, превращающая числа в десятичные http://www.cyberforum.ru/cpp-beginners/thread910371.html
Страуструп Б. Принципы и практика использования C++. Написать программу, считывающая числа (десятичные, восьмеричные или шестнадцатеричные) и превращающая их в десятичное. Нужно, чтобы программа выводила соответствующую информацию: "0x4 шестнадцатеричное превращается в 67 десятичное" "0123 восьмеричное превращается в 291 десятичное" "65 десятичное превращается в 65 десятичное". Согласно...
C++ Разложение числа на множители var s1,s2,n: longint; f: integer; begin write('vvedite natural chislo '); readln(n); f:=0; s1:=1; repeat s2:=s1; http://www.cyberforum.ru/cpp-beginners/thread910370.html
Подсчитать наибольшую глубину вложенности папок и вывести этот путь C++
используя рекурсию необходимо подсчитать наибольшую глубину вложенности папок и вывести этот путь. помогите пожалуйста!!!
C++ составьте программу для вычисления сумм элементов каждой строки матриц A(5,6), С(6,7)
составьте программу для вычисления сумм элементов каждой строки матриц A(5,6), С(6,7)
C++ Как написать класс "вектор" на С++ http://www.cyberforum.ru/cpp-beginners/thread910344.html
Нужно написать класс для нумерации элементов вектора не с 0, а любыми символами.... К примеру в паскалеподобных языках такое осуществимо. То есть элементы вектора 1 2 3 4 5 можно было пронумеровать -10 -9 -8 -7 -6 -5-й элемент. Такую же задачу нужно осуществить на С++
C++ Разбор строк ассемблерной программы Вот код: #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <conio.h> int main() { char buffer; char filename; подробнее

Показать сообщение отдельно
Гром
207 / 126 / 11
Регистрация: 20.03.2009
Сообщений: 1,094
Записей в блоге: 16
Завершенные тесты: 1
24.06.2013, 08:21     Битовые операции (написать функцию для сброса в ноль двух битов с заданными номерами в коде символа)
Начнем от печки. Битовые операции - это И (&), ИЛИ (|) и НЕ (!). Результатом a & b будет число, в котором i-й бит равен единице, если в обоих числах a и b этот же i-й бит равен единице и нулю во всех остальных случаях. Результат a | b - число, где бит равен нулю, если оба бита равны нулю и единице во всех остальных случаях (когда бит a или бит b равен единице). !a - число, у которого все биты заменены на противоположные.

Заметьте, что x | 0 == x (1 | 0 == 1, 0 | 0 == 0) (при использовании ИЛИ с нулем бит не меняется), x | 1 == 1 (при использовании ИЛИ с единицей бит устанавливается в 1), x & 1 == x (1 & 1 == 1, 0 & 1 == 0) (при использовании И с единицей бит не меняется), x & 0 == 0 (при использовании И с нулем бит устанавливается в 0).

Также есть битовые сдвиги - когда биты в числе сдвигают на сколько-то позиций вправо или влево, при этом если биты выходят за пределы числа (в восьмибитном числе бит передвинулся на позицию 9+ или отрицательную) - они теряются, а биты, которые "пришли из-за предела числа" становятся нулями. Например,
C++
1
2
3
4
11001100 >> 1 == 01100110
11001100 >> 2 == 00110011
11000111 << 1 == 10001110
11111111 << 7 == 10000000
Пользуясь этим, мы можем обращаться к отдельным битам числа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int set_2nd_bit_1(int x)
{
return x | 2;   //в двоичном представлении 2 - это 00000010, поэтому все биты числа x, кроме второго остаются неизменными, а второй устанавливается в 1
}
 
int set_2nd_bit_0(int x)
{
return x & (!2);   //!2 - это 11111101, поэтому все биты числа x, кроме второго остаются неизменными, а второй устанавливается в 0
}
 
bool is_2nd_bit_1(int x)
{
return x & 2;   //двойка - это 00000010, поэтому все биты, кроме второго сбрасываются в ноль, а второй остается неизменным. Если он был нулем, получим 0, если нет - получим двойку (00000010), которая отлична от нуля, поэтому при преобразовании к bool будет true
}
С помощью битовых сдвигов можно обращаться к произвольному биту:
C++
1
2
3
4
set_bit_1(int x, int n_bit)
{
return x | (1 << n_bit);   //1 - это 00000001, сдвигая на n_bit позиций (считая первый бит нулевым), получим число с единицей в n_bit разряде. В результате устанавливаем бит в этом разряде в единицу
}
Таким образом, сдвигая единицу на n разрядов, мы можем обращаться к n-му биту - вместо 2 в первых примерах будет (1 << n) ( в том числа x & (! (1 << n)) ).

Ну и, естественно, помним, что int имеет все-таки не восемь бит, а как правило 32 (4 байта).
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru