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

Побитовые операции (программа, которая интерпретирует старшие 3 бита как некоторое число n...) - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Создание дружественных классов http://www.cyberforum.ru/cpp-beginners/thread769686.html
1. Класс Сумка (цвет, содержимое, количество предметов в сумке); 2. Класс Дама (имя); Описание предметной области – дама может положить в сумку какой-либо предмет.
C++ Неправильно работает перегруженный оператор #include <iostream> using namespace std; class PhoneNumber { friend ostream &operator << (ostream &, const PhoneNumber &); friend istream &operator >> (istream &, PhoneNumber &); private:... http://www.cyberforum.ru/cpp-beginners/thread769669.html
C++ Cпособ передачи книги
Группа состоит из N человек. В ней каждый имеет N/2 друзей и не более К врагов. У одного из них есть книга, которую все хотят прочитать. Написать программу, реализующую способ передачи книги таким...
C++ Расчет треугольника
В окно MFC вводятся длины двух сторон треугольника (1,2 строка) и величина угла между ними(3 строка). Найти третью сторону треугольника и вывести результат в четвертую строку. Предположительно...
C++ Произведение элементов в строках, которые не содержат нулевых элементов http://www.cyberforum.ru/cpp-beginners/thread769588.html
Задание: Реализуйте следующие задания своего варианта с использованием шаблона функции. Работа с двумерными массивами. Дана целочисленная прямоугольная матрица. Определить: Произведение элементов в...
C++ multimap: Сортировка значений в пределах одного ключа Добрый день. Каким образом можно отсортировать значения в пределах одного ключа в multimap? Без костылей. подробнее

Показать сообщение отдельно
ValeryS
Модератор
6679 / 5088 / 476
Регистрация: 14.02.2011
Сообщений: 17,090
26.01.2013, 23:34
Цитата Сообщение от Valli1 Посмотреть сообщение
Я недавно узнал о простом сдвиге. И думал, что сдвинуть циклически,
нет
это то что выходит с одной стороны приходит в другую
допустим нужно сдвинуть байт (8 бит) влево циклически
в нем число
01100011
11000110 первый сдвиг пока не отличается от простого сдвига
10001101 второй единица перешла из старшего разряда в младший
00011011 третий единица перешла из старшего разряда в младший
00110110 четвертый ноль перешел из старшего разряда в младший
01101100 пятый
11011000 шестой
10110001 седьмой
01100011 восьмой получили первоначальное число
то же самое и со сдвигом вправо только из младшего значение переходит в старший
в отличии от ассемблера в С нет команды циклического сдвига
можно конечно тупо сделать это циклом проверяя младший(старший) бит

C++
1
2
3
4
5
6
7
8
9
for(int i=0;i<n;i++)
{
   if(r&0x80)
     m=0x01;
   else
     m=0;
    r=r<<1; 
    r=r|m;
}
но это долго
есть способ проще
смотри
01100011 надо сдвинуть на три влево
должно получится
00011011
видишь выделенные разряды ушли вправо
делаем так
пишу по шагам
сдвигаем влево на три разряда
01100011<< 3= 00011000
сдвигаем вправо на разность размера числа( у нас 8 бит) и на число сдвига
01100011>> (8-3)=00000011
и складываем их логически (операция ИЛИ)
00011000 | 00000011= 00011011
всего три операции(четыре если считать вычитание)
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru