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

Операции сдвига - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Error C4996: 'strcpy' http://www.cyberforum.ru/cpp-beginners/thread1309340.html
:cry::wall::rtfm:%-) Нужна помощь! error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See...
C++ PDF to XPS Всем привет. Давно интересует вопрос: Нет ли у кого на примете библиотеки, для перевода PDF документа в XPS формат ? Желательно бесплатную. Лучше с исходным кодом. Которую можно использовать в... http://www.cyberforum.ru/cpp-beginners/thread1309330.html
Найти интеграл C++
Добрый день. Помогите написать код для решения следующей задачи. Вычислить интеграл при а = 0,019; 0.127; 0.346; 0.417; 0.527; 0.696, используя формулу Симпсона с шагом h=0,001 Заранее благодарен...
C++ Определить количество ненулевых значений
Хелп профи. Всю голову уже сломал. Ввести с клавиатуры n целых чисел и определить количество ненулевых значений. Ввод чисел обсепечить с клавиатуры в цикле с помощью операторов for, while, do while...
C++ Поменять местами минимальный среди четных элементов и первый элемент строки матрицы http://www.cyberforum.ru/cpp-beginners/thread1309297.html
Условие такое: Ввести матрицу A NxM , вывести ее. В каждой строке матрицы поменять местами минимальный среди четных элементов и первый элемент строки. Если нет четных элементов в строке, то...
C++ Функция с переменным числом параметров заранее неизвестного типа Здравствуйте, коллеги! Прошу помочь начинающему в С++. Есть функция с переменным числом параметров заранеее неизвестного типа. Внутри начинаю перебирать параметры по ссылке и на первом же... подробнее

Показать сообщение отдельно
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.11.2014, 07:03
Kuzia domovenok, при чём здесь это? Он сдвигами хотел.BESSON_off, когда ты помещаешь значения в переменную сдвигом, то каждое помещаешь на какие то биты. На какие? Предположим, ты собрал двойное слово из байтов:
C++
1
b=((DWORD)x1)|(((DWORD)x2)<<8)|(((DWORD)x3)<<16)|(((DWORD)x4)<<24);
, а потом хочешь вытащить эти байты. На каких битах они находятся? x1 от нулевого до седьмого, так как всего бит в байте 8, а младший бит всегда и везде нулевой. Младший бит значения нулевой, младший бит значения, упакованного в переменную нулевой, позиция одна, двигать не надо, только маска:
C++
1
x=(char)(b&0x000000FF);
. x2 от 8-го до 15-го, а надо от нулевого до седьмого, разница 8. Обратил внимание на то, что она совпадает с величиной сдвига при помещении? Это не случайно. Значит двигать надо в обратную сторону на те же 8, но помещение мог реализовать кто то другой, а тебе сказать только номера бит, тогда считай разность, она равна меньшему номеру (вычитание ноля даёт разность, равную уменьшаемому).
C++
1
x2=(char)((b&0x0000FF00)>>8);
. x3 от 16-го до 23-го, разность 16,
C++
1
x3=(char)((b&0x00FF0000)>>16);
. x4 от 24-го до 31-го, разность 24.
C++
1
x4=(char)((b&0xFF000000)>>16);
. 0x000000FF, 0x0000FF00, 0x00FF0000 и 0xFF000000 - это маски значений. Как их определять? Есть номера битов, которые тебе нужны, пиши двоичное число, в котором биты с этими номерами равны 1, остальные 0, например, 00000000000000001111111100000000 для битов от 8-го до 15-го. Почему именно здесь единицы? Потому что биты нумеруются слева на право с ноля с увеличением на 1:
биты:0000000000000000111
номера битов:31302928272625242322212019181716151413
. Видишь, где единицы? Теперь группируй биты по четыре:
полубайты:00000000000000001111111100000000
на каких они номерах битов:28-3124-2720-2316-1912-158-114-70-3
. Полученные полубайты заменяй на шестнадцатеричные цифры (такая цифра - это тоже полубайт, но в другой системе счисления) по таблице:
двоичный полубайтшестнадцатеричный полубайт
00000
00011
00102
00113
01004
01015
01106
01117
10008
10019
1010A
1011B
1100C
1101D
1110E
1111F
, получается 0000FF00, теперь в начало пиши 0x. Всё, маска готова. При помещении тоже может понадобиться маска, если исходные значения были представлены типами большей разрядности, чем нужно. Какие биты они на самом деле имеют? Составляй маску по аналогии, например, если ты собираещь двойное слово из ASCII, то маска значения 0x7F, при расширении до двойного слова она становится 0x0000007F, тогда
C++
1
b=(((DWORD)x1)&0x0000007F)|((((DWORD)x2)&0x0000007F)<<7)|((((DWORD)x3)&0x0000007F)<<14)|((((DWORD)x4)&0x0000007F)<<21);
, а маски при выделении значений 0x0000007F, 0x00003F80, 0x001FC000 и 0x0FE00000.
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru