Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > С/С++
Перезагрузить страницу Каково будет значение переменной после сдвига
Закрытая тема
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
pinpon pinpon вне форума
Member
 
Сообщений: 76
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 29.08.2006
Thumbs up Каково будет значение переменной после сдвига - 03.09.2006, 19:10

Каково будет значение переменной k после выполнения следующего оператора

k <<= m – 3;

если до его выполнения k равнялось 6, а m равнялось 4?

1. 12
2. 36
3. 1293

Помогите ответить на вопрос (с расшифровкой) и объясните толком что такое побитовый сдвиг?
  (#2 (permalink)) Старый
D_K D_K вне форума
Member
 
Сообщений: 1,681
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 23.11.2005
По умолчанию 03.09.2006, 20:01

Правильный ответ №1, т.е 12.
Побитовый сдвиг - сдвиг двоичного представления числа на определенное число бит .
В нашем случае число k изначально равно 6, т.е в двоичном виде 00000110 (взял char, чтоб нолики лишние не писать). m-3 это 1 (4-1 ). Таким образом получим:
Код:
00000110 k
00001100 k<<1
А 00001100 - это и есть 12.
ЗЫ: кстати, данный код является примером оптимизации, т.к. сдвиг на 1 выполняется быстрее, чем умножение на 2.


импортирован с progz.ru
  (#3 (permalink)) Старый
Fuud Fuud вне форума
Member
 
Сообщений: 4,076
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.09.2004
По умолчанию 03.09.2006, 20:09

Цитата:
объясните толком что такое побитовый сдвиг
Пусть в двоичном виде число записывается как:
11000001
После сдвига влево на единицу, будет:
10000010
После сдвигу вправо:
01100000
То есть число сдвинулось на один разряд влево, а на свободное место дописался ноль.

Итак, сдвиг влево равносилен умножению на два в соответствующей степени. Сдвиг вправо - делению.

Код:
a<<n==a*(2^n)
a>>n==a/(2^n)
^ - возвышение в степень.

Твой пример:
m-3==1

то есть пример сводится к:
k=k<<1

сдвигаем влево на один разряд (умножаем на два):
k=12
  (#4 (permalink)) Старый
pinpon pinpon вне форума
Member
 
Сообщений: 76
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 29.08.2006
По умолчанию 03.09.2006, 20:23

D_K & Fuud Большое Спасибо!!! Все стало понятно


но воздник еще один вопрос по теме

есть число 11000001
делаю сдвиг в лево на 9 получается 00000000 что както подазрительно? или я не туда двигаю?
  (#5 (permalink)) Старый
D_K D_K вне форума
Member
 
Сообщений: 1,681
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 23.11.2005
По умолчанию 03.09.2006, 20:29

Цитата:
D_K & Fuud Большое Спасибо!!! Все стало понятно
нз.
Цитата:
есть число 11000001
делаю сдвиг в лево на 9 получается 00000000 что както подазрительно? или я не туда двигаю?
Все верно, так и будет. Что тут подозрительного? При сдвиге с той стороны, куда двигаешь, биты "пропадают", а с противоположной появляются нули.


импортирован с progz.ru
Ads.
  (#6 (permalink)) Старый
Fuud Fuud вне форума
Member
 
Сообщений: 4,076
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.09.2004
По умолчанию 03.09.2006, 20:35

Цитата:
есть число 11000001
В двоичном виде? Или это десятичное представление?
В любом случае - не туда двигаешь!
  (#7 (permalink)) Старый
pinpon pinpon вне форума
Member
 
Сообщений: 76
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 29.08.2006
По умолчанию 03.09.2006, 20:39

Цитата:
Все верно, так и будет. Что тут подозрительного? При сдвиге с той стороны, куда двигаешь, биты "пропадают", а с противоположной появляются нули.
тоесть

к=128;
m=4;

k<<=m-3;

k равно 0 ???


Цитата:
В двоичном виде? Или это десятичное представление?
В любом случае - не туда двигаешь!
В двоичном! А куда двигать?
  (#8 (permalink)) Старый
D_K D_K вне форума
Member
 
Сообщений: 1,681
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 23.11.2005
По умолчанию 03.09.2006, 20:48

Цитата:
тоесть

к=128;
m=4;

k<<=m-3;

k равно 0 ???
Смотря какой тип, если char, то да (на него всего 1 байт выделяется). Возьми прогу напиши, да эксперементируй)). А вот у меня сейчас не одного С/C++ компилятора под рукой нет .


импортирован с progz.ru
  (#9 (permalink)) Старый
Fuud Fuud вне форума
Member
 
Сообщений: 4,076
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.09.2004
По умолчанию 03.09.2006, 20:51

Цитата:
тоестьк=128;m=4;k<<=m-3;k равно 0 ???
нет, k==256

вот сдвигаем твое число 193
Код:
#include <iostream.h>
#include <conio.h>
#include <stdio.h>

void main()
{
  clrscr();
  cout<< (193<<9);
  getch();
}
  (#10 (permalink)) Старый
pinpon pinpon вне форума
Member
 
Сообщений: 76
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 29.08.2006
По умолчанию 03.09.2006, 21:15

Цитата:
нет, k==256
Да точно! но если k не char а если char тогда 0 (наверное.. у меня подрукой тоже сейчас нет компилятора)
  (#11 (permalink)) Старый
D_K D_K вне форума
Member
 
Сообщений: 1,681
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 23.11.2005
По умолчанию 03.09.2006, 21:16

Цитата:
нет, k==256

вот сдвигаем твое число 193
Код:
#include <iostream.h>
#include <conio.h>
#include <stdio.h>

void main()
{
  clrscr();
  cout<< (193<<9);
  getch();
}
Это потому, что числа int .
В общем, все зависит от количество байтов, отведенных под число.


импортирован с progz.ru
  (#12 (permalink)) Старый
IL_Agent IL_Agent вне форума
Member
 
Аватар для IL_Agent
 
Сообщений: 2,015
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.07.2005
По умолчанию 03.09.2006, 21:21

По сути, сдвиг вправо - это деление на два (целочисленное), а влево - умножение. Если при сдвиге влево старший бит вылезает за разрядную сетку, то он пропадает, поэтому тут есть зависимость от типа, точнее от его размера.
Ads
  (#13 (permalink)) Старый
D_K D_K вне форума
Member
 
Сообщений: 1,681
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 23.11.2005
По умолчанию 03.09.2006, 21:30

Цитата:
По сути, сдвиг вправо - это деление на два (целочисленное), а влево - умножение. Если при сдвиге влево старший бит вылезает за разрядную сетку, то он пропадает, поэтому тут есть зависимость от типа, точнее от его размера.
Вот и я про тоже))


импортирован с progz.ru
  (#14 (permalink)) Старый
pinpon pinpon вне форума
Member
 
Сообщений: 76
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 29.08.2006
По умолчанию 03.09.2006, 21:31

Всем Спасибо!!! все стало понятно!
Ads
Закрытая тема

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
СИ. Каково значение переменной на выходе? isx С/С++ 4 19.01.2012 23:09
Как восстановить первоначальное значение переменной Vitalmsk Вопросы начинающих программистов 8 05.03.2011 15:10
Присвоить переменной F значение 1 swatsam Вопросы начинающих программистов 14 07.01.2011 23:46
Переменной не присваивается значение Dashutka C++ Builder 2 31.03.2007 19:47
Запись переменной в новое значение swat-90 C++ Builder 20 27.12.2006 22:06
Как передать значение переменной tokito ASP 2 02.10.2006 13:07
Как присвоить переменной S значение 0 Lakomka Вопросы начинающих программистов 36 18.10.2005 14:54
Что будет в переменной dwBytesReaded после выполнения этого выражения dwBytesReaded Phinc C++ Builder 1 08.09.2005 19:26
Значение переменной regbist как узнать Regbist Assembler 3 04.05.2005 17:17
После первого вызова RasEnumEntries в переменной dwResult оказывается значение ERROR Srpj C++ Builder 1 26.09.2003 13:38
Присваивание значение переменной Skywalker-cyb Visual C++ 2 06.01.2003 20:25
Присвоение значение переменной Serial Delphi 4 27.11.2002 12:34



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов