Форум программистов, компьютерный форум 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 online help for details. Как исправить? Работаю в VS 13 #include<iostream>
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 Заранее благодарен за ответ. Внизу страницы есть редактор формул!
SFML Code Blocks и sfml
Не могу подружить данный компилятор с SFML при компоновке нет ошибок а при запуске программы пишет не найдена: sfml graphics 2.dll В чем загвоздка?
C++ Определить количество ненулевых значений http://www.cyberforum.ru/cpp-beginners/thread1309304.html
Хелп профи. Всю голову уже сломал. Ввести с клавиатуры n целых чисел и определить количество ненулевых значений. Ввод чисел обсепечить с клавиатуры в цикле с помощью операторов for, while, do while на языке С.
C++ Поменять местами минимальный среди четных элементов и первый элемент строки матрицы Условие такое: Ввести матрицу A NxM , вывести ее. В каждой строке матрицы поменять местами минимальный среди четных элементов и первый элемент строки. Если нет четных элементов в строке, то оставить ее без изменения. #include "stdafx.h" #include <iostream> #include <math.h> using namespace std; int main() { int n, m, min, tmp; int l = 1; подробнее

Показать сообщение отдельно
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.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru