Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
SNIKERSMRG
3 / 3 / 1
Регистрация: 15.08.2013
Сообщений: 30
1

Операции с побитовыми операторами (число 8 битов и число 9 битов)

02.08.2016, 14:54. Просмотров 830. Ответов 7
Метки нет (Все метки)

Доброго времени суток всем !

Прошу ответа на несложный вопрос (...по крайней мере мне так кажется...)

Есть функция:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
unsigned char left_rotate (unsigned char val, int i)
{
unsigned int t;
t = val;
 
for(int i=0; i<n; i++)
    {
     t=t<<1;
     if(t&256)
     t=t | 1; //поместим 1 в самый правый бит
     }
return t;
}
t=t<<1 двигает бит(или все биты ?) налево, тем самым если у нас было число 2, то стало число 4.

Потом выполняется условие:
if(t&256) t=t | 1;

Допустим что в функцию передали (val=2; i=1)
То тогда, после выполнения строки t=t<<1, переменная t примет значение 4.

Дальше проверяется условие Если (t&256) не равно нулю.
0000 0100 (число 4 в двоичной)
1 0000 0000 (число 256 в двоичной)
Операция И имеющая знак &, устанавливает бит равным нулю, если есть ноль в хотя бы в одном из операндов.

Так получается чтобы выполнить эту операцию, нужно к числу 4 добавить еще 1 бит (если считать самому в тетради) ???
Типа число 4 записать как 0 0000 0100, и тогда я смогу побитовую операцию провести.
0 0000 0100
&(и)
1 0000 0000
--------------
0 0000 0000 выходит ноль

Или каким то хитрым способом число 256 трансформируется в восемь бит, чтобы я мог с четверкой операцию провести ?


И кстати хотел уточнить, по поводу вот этой строки:
t=t | 1; //поместим 1 в самый правый бит (так написано в книге)

Вот скажем есть у меня число 4 (0000 0100)
тогда получается t=4|1;
0000 0100
|(или)
0000 0001
------------
0000 0101 выходит число 5

Так что это нам в итоге дало ? непонятен смысл.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2016, 14:54
Ответы с готовыми решениями:

Узнать из каких битов состоит число
Нашёл очень интересную для себя конструкцию, а именно вот эта строчка кода...

Из двух целых чисел А и B собрать одно, состоящее из четных битов A и нечетных битов B...
Нужна помощь с задачей. Из двух целых чисел А и B собрать одно, состоящее из...

Перевод таблицы битов и времени в последовательность битов arduino
доброго времени суток в приведенной ниже таблице левый столбец - биты, правый...

Число смежных цветовых битов для каждого пикселя
Ругается на GetDeviceCaps(HDC, int), как я понял, это дескриптор контекста...

Ввести число и вывести результат циклического сдвига его битов на 1 разряд влево
Проверьте пожалуйста, правильное ли решение. Ввести число и вывести результат...

7
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
02.08.2016, 15:07 2
Лучший ответ Сообщение было отмечено SNIKERSMRG как решение

Решение

Если восьмой бит был единицей, то при сдвиге влево на 1 он станет девятым в int, а для char должен стать первым, поэтому его переносят с помощью ИЛИ. В твоём примере 5 не может получиться - девятый бит 0.
1
SNIKERSMRG
3 / 3 / 1
Регистрация: 15.08.2013
Сообщений: 30
02.08.2016, 15:14  [ТС] 3
nmcf, а номер бита слева направо или справо налево считают ?
0
HenryDukart
124 / 124 / 44
Регистрация: 05.10.2013
Сообщений: 457
Завершенные тесты: 2
02.08.2016, 15:25 4
Цитата Сообщение от SNIKERSMRG Посмотреть сообщение
Или каким то хитрым способом число 256 трансформируется в восемь бит, чтобы я мог с четверкой операцию провести ?
Литеральная константа 256 имеет тип int.

Цитата Сообщение от SNIKERSMRG Посмотреть сообщение
а номер бита слева направо или справо налево считают ?
Справа налево, если не оговорено иначе.
1
SNIKERSMRG
3 / 3 / 1
Регистрация: 15.08.2013
Сообщений: 30
02.08.2016, 15:33  [ТС] 5
nmcf,
t=t<<1; (это строка число 0000 0010 превращает в 0000 0100)
if(t&256) t=t | 1; (в этой строке если выражение в скобках не равно нулю то выполняется выражение t=t | 1

т.е. переменной t присвоится результат выполнения
0000 0100
|(или)
0000 0001
------------
0000 0101 а это число 5


Переменная 1-----Переменная 2------операция ИЛИ
Ложь---------------Ложь---------------Ложь
Ложь---------------Истина-------------Истина
Истина-------------Истина-------------Истина
Истина-------------Ложь---------------Истина

Добавлено через 4 минуты
HenryDukart, литеральная константа 256 имеет тип int.
А можно как то не сложно объяснить почему она стала константой по вашему ?
Или я вас не так понял ?
0
HenryDukart
124 / 124 / 44
Регистрация: 05.10.2013
Сообщений: 457
Завершенные тесты: 2
02.08.2016, 15:41 6
Цитата Сообщение от SNIKERSMRG Посмотреть сообщение
А можно как то не сложно объяснить почему она стала константой по вашему ?
Можете почитать в любой книге по программированию или на википедии Литерал.

Если объяснить просто, то константе вы не можете присвоить значение. Вы же не будете писать 256 = 42.
1
SNIKERSMRG
3 / 3 / 1
Регистрация: 15.08.2013
Сообщений: 30
02.08.2016, 15:48  [ТС] 7
nmcf, похоже начал немного вас понимать.

Но есть вопрос.

unsigned char left_rotate (unsigned char val, int i)
{
unsigned int t;
t = val;

Переменной "t" типа unsigned int, присваивается значение типа unsigned char (например буква А)
т.е. переменная "t" в итоге будет хранить значение ввиде числа 65 во время операций, а после выполнения функции возвращает значение в виде char символа.

Если восьмой бит был единицей, то при сдвиге влево на 1 он станет девятым в int, а для char должен стать первым
так у меня же операции вроде в int производятся.

Добавлено через 37 секунд
HenryDukart, Аааа... вы про это) ну это понятно))
0
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
02.08.2016, 17:34 8
Лучший ответ Сообщение было отмечено SNIKERSMRG как решение

Решение

int для того и выбран, чтобы выдвигаемый бит (для char) не терялся. А сама функция принимает и возвращает char. Символы там или не символы - это вопрос интерпретации. char просто целый тип.
1
02.08.2016, 17:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2016, 17:34

Подсчитать среднее арифметическое тех элементов массива, что содержат четное число битов, не равных 1
В массиве целых чисел подсчитать среднее арифметическое тех элементов, что...

Операции со сдвигом битов
Решил позакрывать немного дырки в знаниях, и наткнулся на такую вещь)) ...

Побитовые операции. Инверсия нечетных битов
Дано длинное целое неотрицательное число. Получить число, инвертируя его...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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