Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
2 / 2 / 1
Регистрация: 03.11.2014
Сообщений: 128
1

Прокомментировать маленькую функцию

25.01.2016, 12:32. Показов 846. Ответов 3
Метки нет (Все метки)

Здравствуйте, не понимаю как работает вот эта функция. Заранее спасибо.
Допустим a = 5, n = 4.
C
1
2
3
4
5
6
7
8
9
10
int binpow (int a, int n) {
    int res = 1;
    while (n) {
        if (n & 1)         //не понимаю, что тут проверяется? По идее & это И.
            res *= a; //собственно не понимаю, при каком условии мы сюда входим.
        a *= a;
        n >>= 1;        //здесь как я понял выполняется такая операция 4:(2^1).
    }
    return res;
}
Добавлено через 11 минут
И хотелось бы услышать как будет работать эта функция, если a = 2, n = 3.
C
1
n >>= 1; //просто при таком условии получается что 3:(2^1) n = 1.5
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.01.2016, 12:32
Ответы с готовыми решениями:

Прокомментировать функцию сортировки
пожалуйста помогите разобраться в функции сортировки по длине строки вот сама функция сортировки...

Разобрать и прокомментировать рекурсивную функцию
Здравствуйте, начал изучать Си сравнительно недавно, помогите разобрать код "по полочкам". int...

Преобразование большой буквы в маленькую
printf("Enter the first line : "); gets(str1); for (int i = 0; i < strlen(str1); i++) if...

Напишите маленькую часть кода. Крестики-нолики
Вот мой код: #include <stdio.h> #include <stdlib.h> #include <windows.h> char matrix; ...

3
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
25.01.2016, 12:43 2
Лучший ответ Сообщение было отмечено sky123 как решение

Решение

C
1
if (n & 1)
битовая операция. логическое И это &&
C
1
while (n)
перестанет работать только когда n=0
sky123, скачайте книгу Ритчи, Кэрниган "Язык программирования Си" в конце книги есть справочник, да и самц книгу можно использовать как справочник и там, в книге посмотрите про битовые опреции и цикл while
вопросы "отпадут"
1
2 / 2 / 1
Регистрация: 03.11.2014
Сообщений: 128
25.01.2016, 14:06  [ТС] 3
SergioO, можете объяснить вот с этим?
C
1
if (n & 1)
Допустим n = 2. Двоичный код 2: 10, единицы: 01 Получается мы сравниваем эти два числа и истинно получается только если n = 1 это так? И получается в if входим если только n = 1. Почему тогда нельзя просто сравнивать n с единицей? Заранее спасибо за ответ.
0
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
25.01.2016, 21:24 4
Лучший ответ Сообщение было отмечено sky123 как решение

Решение

оператор & - побитовый оператор И часто используется для обнуления некоторой группы разрядов.
булеву алгебру знаете? 0 И 1 что будет? правильно 0.
получается, если число в двоичном представлении оканчивается 1, то тогда , например 7(1011)&1=1, 4(10)&1=1, те условие n&1 - истинно тогда, когда n - нечетное число
Дальше, операторы << и >> сдвиг влево и сдвиг вправо соответственно.
Так, х << 2 сдвигает значение х влево на 2 позиции, заполняя освобождающиеся биты нулями, что эквивалентно умножению на 4.
n>>=1 означает n=n>>1, те сдвинуть n вправо на один бит, например было 1010101 далее 1010101 >> 1 =101010 (последнюю цифру как бы отрезали), если число A четное, то A>>=1 -это деление A на 2
это для вот таких выражений https://www.cyberforum.ru/cgi-bin/latex.cgi?{5}^{{2}^{7}}

C++
1
binpow(5,31)
https://www.cyberforum.ru/cgi-bin/latex.cgi?{5}^{31}={5}^{{2}^{4}}*{5}^{{2}^{3}}*{5}^{{2}^{2}}*{5}^{{2}^{1}}*{5}^{{2}^{0}}

а=5, n=31=11111
цикл 1:
if (n&1) // те если в текущем разряде есть 1, то умножаем
res*=a;// уже res 5
a*=a; // https://www.cyberforum.ru/cgi-bin/latex.cgi?5*5={5}^{2}
n>>=1 // из 11111 делаем 01111
цикл 2:
if (n&1) //те если в текущем разряде есть 1, то умножаем
res*=a; // a у нас уже а https://www.cyberforum.ru/cgi-bin/latex.cgi?5*5={5}^{2}

и т.д. пока не получим n=00000
объяснил как мог

Добавлено через 1 час 13 минут
4(10)&1=1 - ошибка, конечно же 4(10)&1=0
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.01.2016, 21:24

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Вывести слова, которые имеют хотя бы 1 маленькую букву
Здравствуйте. Помогите пожалуйста исправить ошибку, не совсем разобрался со строками...надо вывести...

Напечатать все слова, начинающиеся на большую, и заканчивающиеся на маленькую букву
Выделить в строке предложении s все слова, разделенные символами-разделителями...

Найти самую маленькую цифру целого числа (использовать функцию)
1 Задание. Найти самую маленькую цифру целого числа (использовать функцию)

Написать функцию, которая переводит введенную пользователем маленькую букву в большую
Ребят помогите пожалуйста написать функцию, которая переводит введенную пользователем маленькую...


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

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

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