Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Как работает этот небольшой код?


Автор: PascalC 26.3.2009, 00:30
Есть такой код: генерирует набор подмножеств в виде {A1, ..., Am}, где m от 1 до n
Код

#include <stdio.h>

int main()
{
int n, l, i, k;

printf("n = ");
scanf("%d",&n);

for (l = 0; l < (1<<n); l++){
    printf("{");
    k =l;
    for (i = 1;i <= n; i++, k >>= 1){
        if (k&0x1)
            printf(" A%d", i);

    }
    printf("}\n");
}
}

не совсем понятно, что обозначает запись вида 1<<n и k >>= 1 
и еще k&0x1 это я так понял побитовое сложение с единицей?
объясните пожалуйста, как работает данный код

Автор: Anikmar 26.3.2009, 00:35
Цитата(PascalC @  26.3.2009,  00:30 Найти цитируемый пост)
не совсем понятно, что обозначает запись вида 1<<n и k >>= 1 
и еще k&0x1 это я так понял побитовое сложение с единицей?
объясните пожалуйста, как работает данный код 


1 << n Сдвинуть 1 на n бит влево.

k >>= 1

Сокращенная запись:
k = k >> 1

Сдвинуть k на 1 бит вправо

Автор: PascalC 26.3.2009, 00:43
спасибо

Автор: bsa 26.3.2009, 01:27
k&0x1 - это побитовое "И", т.е. в данном случае выделение из k младшего разряда, фактически это получится флаг нечетности.

Автор: azesmcar 26.3.2009, 10:02
Цитата

1 << n Сдвинуть 1 на n бит влево.


точно, а другими словами - умножает на два n раз.
например ( 1 << 5 ) == 32

а смещение вправо - делит на 2
например ( 20 >> 2 ) == 5

Автор: GoldFinch 26.3.2009, 10:18
azesmcar, на троичной машине он будет умножать на 3^n а не на 2^n
поэтому эта операция называется сдвиг а не умножение\деление


и не "на 1 бит" а "на 1 разряд" =\

Автор: mes 26.3.2009, 10:25
Цитата(GoldFinch @  26.3.2009,  09:18 Найти цитируемый пост)
на троичной машине он будет умножать на 3^n а не на 2^n
поэтому эта операция называется сдвиг а не умножение\деление


и не "на 1 бит" а "на 1 разряд" =\ 

т.е Си-программа откомпилированная на троичной машине даст иной результат ?!  smile 

Автор: azesmcar 26.3.2009, 10:26
GoldFinch, вы видели троичные машины? звучит как научная фантастика  smile

Цитата

поэтому эта операция называется сдвиг а не умножение\деление


а где я говорил что эта операция называется деление?

Добавлено через 6 минут и 3 секунды
а вообще - это так..если уж играем в слова

Бит (англ. binary digit)
Цитата

1. Один разряд двоичного кода (двоичная цифра). Может принимать только два взаимоисключающих значения: да/нет, 1/0, включено/выключено, и т. п. В электронике 1 биту соответствует 1 двоичный триггер.


http://ru.wikipedia.org/wiki/%D0%91%D0%B8%D1%82

и троичные машины по моему звучит странно.

Автор: Anikmar 26.3.2009, 10:50
Цитата(GoldFinch @  26.3.2009,  10:18 Найти цитируемый пост)
и не "на 1 бит" а "на 1 разряд" =\ 


Главное, чтобы поняли правильно. На самом деле сплошь и рядом кто как называет.

Например http://xlibscripts.land.ru/jscript_doc/JavaScript/OperatorsJS.html
http://ru.wikibooks.org/wiki/Ruby/Подробнее_о_числах
http://ad.cctpu.edu.ru/cpp/glava3_5.htm
http://www.intuit.ru/department/pl/perl/3/3.html

Многие то так то так говорят, а как говорит стандарт - в прикрепленном файле (не дает акробат копировать)

Автор: GoldFinch 26.3.2009, 11:26
mes, ну логичнее всего что на троичной платформе операция поразрядного сдвига будет сдвигать на троичные разряды, а не умножать\делить на 2

Цитата(azesmcar @  26.3.2009,  10:26 Найти цитируемый пост)
а где я говорил что эта операция называется деление?

Цитата(azesmcar @  26.3.2009,  10:02 Найти цитируемый пост)
а смещение вправо - делит на 2


Цитата(Anikmar @  26.3.2009,  10:50 Найти цитируемый пост)
Например тут - побитовый сдвиг назвали
Тут - тоже
Здесь применили смешанное название
Здесь опять побитовый сдвиг

прям скажем не очень-то авторитетные источники

Цитата(azesmcar @  26.3.2009,  10:26 Найти цитируемый пост)
В электронике 1 биту соответствует 1 двоичный триггер.

а вот это лол)

Автор: azesmcar 26.3.2009, 11:29
Цитата

а смещение вправо - делит на 2


тут говорится что операция смещение вправо называется делением или говорится что смещение вправо делит на два?
думайте...

Автор: Albor 26.3.2009, 11:29
Цитата(GoldFinch @  26.3.2009,  09:18 Найти цитируемый пост)
и не "на 1 бит" а "на 1 разряд" =\ 

GoldFish, для общего развития, в чём разница при двоичном представлении числа (ведь именно в таком виде число хранится в памяти)? Честно сказать, я не помню различий между этими терминами, правда курс ЦЭВМ изучался мною довольно давно, может с тех пор что-то изменилось.

Автор: azesmcar 26.3.2009, 11:30
Цитата

а вот это лол) 


а что тут именно вам показалось смешным?

Добавлено @ 11:31
Цитата

прям скажем не очень-то авторитетные источники


приведите авторитетные. А стандарт С++ для вас недостаточно авторитетен?

Автор: GoldFinch 26.3.2009, 11:43
в советской\российской терминологии (и на пост-советском пространстве наверное тоже)  бит и двоичный разряд это разные понятия
двоичный разряд, десятичный разряд, разряд в позиционной системе счисления с целым основанием n - это величина которая может принимать n различных значений, и имеет некоторый вес зависящий от позиции разряда в числе
бит - это единица измерения количества информации
иногда битом называют двоичный разряд (по аналогии с зарубежным Binary digIT), и наверное в ряде случаев это допустимо, но правильнее называть двоичный разряд двоичным разрядом

пример различия этих терминов - 
"в переменой типа bool 32 (двоичных) разряда"
"в переменой типа bool 1 бит (информации)"

Добавлено через 2 минуты и 16 секунд
Цитата(azesmcar @  26.3.2009,  11:30 Найти цитируемый пост)
стандарт С++ для вас недостаточно авторитетен?

мы же пишем "бит" а не "bit", русского перевода стандарта С++ вроде бы нет

Автор: mes 26.3.2009, 11:47
Цитата(GoldFinch @  26.3.2009,  10:26 Найти цитируемый пост)
mes, ну логичнее всего что на троичной платформе операция поразрядного сдвига будет сдвигать на троичные разряды, а не умножать\делить на 2

неа.. не логично, потому что операция - двоичный сдвиг ( сдвиг двоичного разряда )

Цитата(GoldFinch @  26.3.2009,  09:18 Найти цитируемый пост)
и не "на 1 бит" а "на 1 разряд" =\ 

первое правильнее, именно на один бит, а не на некий абстрактный разряд.



Автор: GoldFinch 26.3.2009, 11:50
Цитата(azesmcar @  26.3.2009,  11:30 Найти цитируемый пост)
а что тут именно вам показалось смешным?

что автор не знает ни что такое "двоичный" триггер, ни что такое 1 бит или 1 двоичный разряд

Автор: azesmcar 26.3.2009, 12:07
Цитата

что автор не знает ни что такое "двоичный" триггер, ни что такое 1 бит или 1 двоичный разряд


что-то я не припомню чтобы автор описывал что такое двоичный триггер. Это описано вот http://ru.wikipedia.org/wiki/%D0%94%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D1%8B%D0%B9_%D1%82%D1%80%D0%B8%D0%B3%D0%B3%D0%B5%D1%80

и описано довольно таки на уровне..если у вас есть замечания - приводите аргументы, не бросайтесь словами - "автор не знает что такое триггер". Я во всяком случае считаю что знаю и согласен с тем что описывает вышеупомянутая ссылка. 

Цитата

мы же пишем "бит" а не "bit", русского перевода стандарта С++ вроде бы нет 


вы утверждаете что бит и bit - разные слова и имеют разные значения?

Автор: Albor 26.3.2009, 12:11
Вобщем то, не стоит спорить, так как на эти термины есть разные взгляды http://ru.wikipedia.org/wiki/%D0%91%D0%B8%D1%82

Автор: azesmcar 26.3.2009, 12:18
Цитата

Вобщем то, не стоит спорить, так как на эти термины есть разные взгляды http://ru.wikipedia.org/wiki/%D0%91%D0%B8%D1%82 


как на них не смотри..операция << называется операцией двоичного сдвига. т.е. вести себя она должна по любому так же как ведет на любой другой платформе..я уж не говорю о том что троичные компьютеры - это давняя разработка - причем ее давно оставили, хотя и предполагают к ней вернутся "когда нибудь в будущем".

Автор: vinter 26.3.2009, 12:29
в последнее время эта ветка просто заполонена словоедами и оптимизаторами. Господа, может быть не будем отвлекатся, а будем отвечать на посталенные вопросы, без показывания всем, вашей блестящей эрудиции

Автор: Anikmar 26.3.2009, 12:52
Цитата(Albor @  26.3.2009,  12:11 Найти цитируемый пост)
Вобщем то, не стоит спорить, так как на эти термины есть разные взгляды http://ru.wikipedia.org/wiki/%D0%91%D0%B8%D1%82 

Собственно именно это я хотел сказать.

Цитата(vinter @  26.3.2009,  12:29 Найти цитируемый пост)
в последнее время эта ветка просто заполонена словоедами и оптимизаторами. Господа, может быть не будем отвлекатся, а будем отвечать на посталенные вопросы, без показывания всем, вашей блестящей эрудиции 

 smile 

Главное, что ТС понял о чем речь. 

Автор: azesmcar 26.3.2009, 13:03
Цитата

я представляю себе сдвиг n-ичного разряда, но чтото плохо представляю себе двоичный сдвиг n-ичного разряда, да и вообще понятие "двоичный сдвиг" мне совсем непонятно


а я плохо представляю себе работу синхрофазатрона, но все же он работает smile

Автор: mes 26.3.2009, 13:04
Цитата(GoldFinch @  26.3.2009,  10:50 Найти цитируемый пост)
я представляю себе сдвиг n-ичного разряда, но чтото плох

там ошибку внес при  редактировании и сразу не заметил так как отвлекли..  исправил

Цитата(GoldFinch @  26.3.2009,  10:50 Найти цитируемый пост)
вообще понятие "двоичный сдвиг" мне совсем непонятно

a как относитесь к двоичному И. Та же самая логика названия.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)