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

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

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

Поразрядные операторы,операторы сдвига - C++

11.04.2013, 22:47. Просмотров 343. Ответов 1
Метки нет (Все метки)

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
using namespace std;
int bitcount(unsigned x)
{
    int b;
    for(b=0;x!=0;x>>=1)
        if(x&01)
            b++;
    return b;
}
void main()
{
    int i=3;
    cout<<bitcount(i);
}
я понимаю что выполняет эта функция - считает количество единичных битов в двоичном представлении числа i
Но как это все происходит пошагово в цикле и что там делается в каждом шаге я не понимаю
я не понимаю эти поразрядные операторы - читал в учебниках про них, но все равно не могу представить подробно что в цикле происходит
в байте - 8 бит т.е. там как то цикл for пробегает всегда 8 раз ,но как он там и в каком месте сравнивает единички и нули я не могу понять и почему именно один байт, если во время определения переменной i в каком то месте памяти выделяется 4 байта для хранения встроенного типа данных int а не один
извините за свои корявые изложения мыслей т.к. скорей всего кое-где криво и неправильно выразился в своем сообщении потому-что изучаю Си не больше месяца.
Объясните пожалуйста что в цикле for происходит
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2013, 22:47     Поразрядные операторы,операторы сдвига
Посмотрите здесь:

Поразрядные операторы сдвига - C++
Всем хорошо известно, что поразрядные операторы сдвига &gt;&gt; и &lt;&lt; сдвигают все биты переменной вправо или влево. Во время сдвига битов в один...

Переписать символы с входящего рядка в выходящий, меняя операторы языка паскаль на операторы языка С++ := на =, = на ==, # на != - C++
Переписать символы с входящего рядка в выходящий, меняя операторы языка паскаль на операторы языка С++ := на =, = на ==, # на != Спасибо.

Операторы - C++
#include &lt;iostream&gt; using namespace std; class VECT { int *pa; int size; int k;

Операторы if else - C++
Ребята, нужна помощь: Какие значения получат переменные А и В в результате выполнения фрагмента программы if (A&gt;B) A=B; else B=A; A=A+1;…...

Операторы - C++
Решил попрактиковаться в 2d игре teeworlds открытый исходный код на С++ Встретился мне там вот такой оператор |= &amp;= //и вот...

операторы - C++
используя while, do while и for (тремя способами) вывести на экран таблицу перевода 5, 10, 15, ..., 120 долларов сша в рубли по текущему...

Операторы if else - C++
Ребята помогите написать код на С++ Заранее благодарен. Написать программу, которая просит пользователя ввести с клавиатуры...

Операторы for , do while - C++
Помогите, пожалуйста сделать 2 задачки: 1.Напишите программу, которая выводит на экран квадрат Пифагора - таблицу умножения. 1 2 3 4...

Операторы С ++ - C++
А вот эту задачу пожалуйста, тоже в С ++)) Здание: Дан порядковый номер дня месяца, вывести на экран количество дней оставшихся до конца...

операторы - C++
Здравствуйте, столкнулся с такой проблемой Есть мной написаный класс Set(множество с дискретной математики) Есть метод Complement...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6552 / 5018 / 463
Регистрация: 14.02.2011
Сообщений: 16,741
11.04.2013, 23:00     Поразрядные операторы,операторы сдвига #2
Цитата Сообщение от alekopi Посмотреть сообщение
for(b=0;x!=0;x>>=1)
крутить пока x!=0
делить x на 2 x>>=1
Цитата Сообщение от alekopi Посмотреть сообщение
if(x&01)
проверить есть ли младший бит
если есть то
Цитата Сообщение от alekopi Посмотреть сообщение
b++;
Добавлено через 4 минуты
Цитата Сообщение от alekopi Посмотреть сообщение
8 бит т.е. там как то цикл for пробегает всегда 8 раз ,
кто тебе это сказал?
это алгоритм приведения десятичного числа в двоичное методом деления
при 3 (0000 0000 0000 0000 0000 0000 0000 0011) цикл покрутится 2 раза
первый проход 0000 0011
if(x&01) 0000 0001 прибавляем b++;
второй проход 3/2=1
0000 0001
if(x&01) 0000 0001 прибавляем b++;
третий проход
1/2=0
x!=0; ложь выходим из цикла
Ответ Создать тему
Опции темы

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