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

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

Восстановить пароль Регистрация
 
RusUaBy
 Аватар для RusUaBy
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 20
14.11.2013, 21:40     Не могу понять, как работает побитовый сдвиг #1
Есть вот такой код:
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. Почему?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2013, 21:40     Не могу понять, как работает побитовый сдвиг
Посмотрите здесь:

Побитовый сдвиг C++
C++ Побитовый сдвиг массива
C++ Побитовый сдвиг
Побитовый сдвиг C++
Не могу понять как работает программа C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
14.11.2013, 21:44     Не могу понять, как работает побитовый сдвиг #2
Цитата Сообщение от RusUaBy Посмотреть сообщение
Не понятно, как работает побитовый сдвиг: переменная wv2 после выполнения данного алгоритма должна стать, по идее(считал на бумажке), 224, а выдает -32. Почему?
Цитата Сообщение от RusUaBy Посмотреть сообщение
wv2 = invar << 28;
переполнение
RusUaBy
 Аватар для RusUaBy
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 20
14.11.2013, 21:46  [ТС]     Не могу понять, как работает побитовый сдвиг #3
Цитата Сообщение от Jupiter Посмотреть сообщение
переполнение
А как его избежать? Мне необходимо избавиться от старшей тетрады байта, выделив младшую. То есть в одной переменной хранится страшая тетрад, в другой младшая.
programina
 Аватар для programina
1912 / 597 / 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
RusUaBy
 Аватар для 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 бита, у меня возникает переполнение, которое портит мне все значение.
programina
 Аватар для programina
1912 / 597 / 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;
}
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
14.11.2013, 22:27     Не могу понять, как работает побитовый сдвиг #7
если по примитивному, то
n>>m - деление на (2 в степени m)
n<<m - умножение на (2 в степени m)
RusUaBy
 Аватар для RusUaBy
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 20
14.11.2013, 22:29  [ТС]     Не могу понять, как работает побитовый сдвиг #8
А как обратиться к определенному биту, чтобы его изменить?
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
14.11.2013, 22:31     Не могу понять, как работает побитовый сдвиг #9
numb = numb^(bit<<bitn);
гда bit 1 или 0 bitn - номер бита
както так
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
14.11.2013, 23:34     Не могу понять, как работает побитовый сдвиг #10
Цитата Сообщение от Cra3y Посмотреть сообщение
гда bit 1 или 0
C++
bit<<bitn; // 1 << 31
скорее всего 1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2013, 00:19     Не могу понять, как работает побитовый сдвиг
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 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;
Вот так вроде должно быть норм...
Yandex
Объявления
15.11.2013, 00:19     Не могу понять, как работает побитовый сдвиг
Ответ Создать тему
Опции темы

Текущее время: 13:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru