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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
RusUaBy
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 20
#1

Не могу понять, как работает побитовый сдвиг - C++

14.11.2013, 21:40. Просмотров 917. Ответов 10
Метки нет (Все метки)

Есть вот такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int invar, wv1, wv2, et, yt, resv;
    invar = 14;
    wv1 = invar >> 4;
    printf("%i\n", wv1);
    wv1 = wv1 << 28;
    printf("%i\n", wv1);
    wv1 = wv1 >> 24;
    printf("%i\n", wv1);
    wv2 = invar << 28;
    printf("%i\n", wv2);
    wv2 = wv2 >> 24;
    printf("%i\n", wv2);
    return 0;
Не понятно, как работает побитовый сдвиг: переменная wv2 после выполнения данного алгоритма должна стать, по идее(считал на бумажке), 224, а выдает -32. Почему?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2013, 21:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не могу понять, как работает побитовый сдвиг (C++):

Как происходит побитовый сдвиг? - C++
for(int i = 0; i &lt; 10; i ++){ if (i &amp; (1 &lt;&lt; j)) cout &lt;&lt; i &lt;&lt; endl; }

Как реализовать правильный побитовый сдвиг? - C++
Всем привет! У меня тупик в неожиданном месте) Я имею пару чаров и должен из них собрать int: char a1 = 224; char a2 = 18; ...

Побитовый сдвиг - C++
есть допустим переменная unsigned char data = 0b10111011; Как можно сделать за 4 шага по битовый сдвиг на двух половинах как...

Побитовый сдвиг - C++
#include &lt;iostream&gt; using namespace std; int main(int argc, char** argv) { int a,b,c,i; cin &gt;&gt;a; cin &gt;&gt;c; cin &gt;&gt;b; do...

Побитовый сдвиг - C++
Выполнение данного кода приравнивает asd к нулю. Хотя должно к единице, судя по моим вычислениям. char asd = 10 &amp; 2 &gt;&gt; 1; 1010 ...

Побитовый сдвиг - C++
Непонятна часть программы с 24 по 45 строку. Помогите разобраться, пожалуйста. #include &lt;iostream&gt; using namespace std; const int...

10
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
14.11.2013, 21:44 #2
Цитата Сообщение от RusUaBy Посмотреть сообщение
Не понятно, как работает побитовый сдвиг: переменная wv2 после выполнения данного алгоритма должна стать, по идее(считал на бумажке), 224, а выдает -32. Почему?
Цитата Сообщение от RusUaBy Посмотреть сообщение
wv2 = invar << 28;
переполнение
1
RusUaBy
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 20
14.11.2013, 21:46  [ТС] #3
Цитата Сообщение от Jupiter Посмотреть сообщение
переполнение
А как его избежать? Мне необходимо избавиться от старшей тетрады байта, выделив младшую. То есть в одной переменной хранится страшая тетрад, в другой младшая.
0
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
14.11.2013, 21:53 #4
запись 1-8 в 10-тичной системе и в двоичной системе.
Код
 1  00000001
 2  00000010
 3  00000011
 4  00000100
 5  00000101
 6  00000110
 7  00000111
 8  00001000
Например если взять сейчас 8-ку и применить к ней сдвиг, то он вернет другое число:
00001000 сдвинется вправо на две позиции ( 00001000 ) и станет 00000010

C++
int b = 8 >> 2; // 00000010 то есть 2
Обрати внимание, что сдвиг на одну позицию вправо делит число на 2, а влево умножает на 2
1
RusUaBy
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 20
14.11.2013, 22:14  [ТС] #5
Цитата Сообщение от programina Посмотреть сообщение
запись 1-8 в 10-тичной системе и в двоичной системе.
Код
 1  00000001
 2  00000010
 3  00000011
 4  00000100
 5  00000101
 6  00000110
 7  00000111
 8  00001000
Например если взять сейчас 8-ку и применить к ней сдвиг, то он вернет другое число:
00001000 сдвинется вправо на две позиции ( 00001000 ) и станет 00000010

C++
int b = 8 >> 2; // 00000010 то есть 2
Обрати внимание, что сдвиг на одну позицию вправо делит число на 2, а влево умножает на 2
Это я понимаю. Но когда я приближаюсь к границе типа int, 32 бита, у меня возникает переполнение, которое портит мне все значение.
0
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
14.11.2013, 22:23 #6
RusUaBy, пользуйтесь более широкими типами, например long
C++
#include <iostream>
#include <cstdint> // -std=c++11
using namespace std;
 
int main ()
{
    int64_t wv2 = 14; // long wv2 = 14;
 
    wv2 = wv2 << 28;
    cout << wv2 << endl;
 
    wv2 = wv2 >> 24;
    cout << wv2 << endl;
}
1
Max Dark
шКодер самоучка
1849 / 1649 / 603
Регистрация: 09.10.2013
Сообщений: 3,676
Записей в блоге: 6
Завершенные тесты: 2
14.11.2013, 22:27 #7
если по примитивному, то
n>>m - деление на (2 в степени m)
n<<m - умножение на (2 в степени m)
0
RusUaBy
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 20
14.11.2013, 22:29  [ТС] #8
А как обратиться к определенному биту, чтобы его изменить?
0
Max Dark
шКодер самоучка
1849 / 1649 / 603
Регистрация: 09.10.2013
Сообщений: 3,676
Записей в блоге: 6
Завершенные тесты: 2
14.11.2013, 22:31 #9
numb = numb^(bit<<bitn);
гда bit 1 или 0 bitn - номер бита
както так
1
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
14.11.2013, 23:34 #10
Цитата Сообщение от Cra3y Посмотреть сообщение
гда bit 1 или 0
C++
bit<<bitn; // 1 << 31
скорее всего 1
0
Max Dark
шКодер самоучка
1849 / 1649 / 603
Регистрация: 09.10.2013
Сообщений: 3,676
Записей в блоге: 6
Завершенные тесты: 2
15.11.2013, 00:19 #11
programina, Бывает необходимость установить 0 на месте бита...

Добавлено через 4 минуты
Хотя, каюсь, мой код не правильный(

Добавлено через 29 минут
C++
1
2
3
4
5
6
7
8
9
10
11
n = 0;
result = 0;
do {
  if(n==bitn)
    result|=(bit<<bitn);
  else
    resilt|=(numb&(1<<n));
  ++n;
}
whle(n<sizeof(numb)*8);
numb = result;
Вот так вроде должно быть норм...
1
15.11.2013, 00:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2013, 00:19
Привет! Вот еще темы с ответами:

Побитовый сдвиг - C++
Добрый день, помогите пожалуйста с побитовым сдвигом вправо, не получается добиться верной работы, укажите на ошибку пожалуйста, спасибо! ...

Побитовый сдвиг - C++
Столкнулся с проблемой. У меня есть ключ - 0x1A305B98 Из него я получаю параметр путем int parm = (0x1A305B98 &gt;&gt; 20) &amp; 0x1F;// = 3 ...

Не могу понять, как работает программа - C++
Здравствуйте, непонятны некоторые функции программы. Спасибо. #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;cstring&gt; ...

Не могу понять как работает программа - C++
Здравствуйте люди.Помогите понять как работают фнкции в программе(см. ниже). Учусь по книге Стефана Девидса С++ для чайников 4-е и 5-е...


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

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

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