Сдвиг в си
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Можно, например, так:
Переменная
carry
содержит младший бит, который должен быть перенесён в старшую позицию тетрады.(num & 0xf)
— выделена младшая тетрада(num & 0xf) >> 1
— младшую тетраду сдвинули на один бит вправо(num & ~0xf)
— сбросить биты младшей тетрады в 0Осталось сложить получившееся вместе и установить старший бит тетрады, если
carry
не равна 0.Хорошее число 3276 ;)
Nikita1881, сам-то своей программой пробовал пользоваться? Удобно? Я — так просто охренел от такого пользовательского интерфейса.
Начинаем сначала: запускаем программу. «Перед началом использования программы ознакомьтесь с инструкцией». «О'кей, Гугл! Инструкция к программе...» Т.е. я хотел узнать, а где, собственно, инструкция? Оказывается на пункте меню 5, которого в меню нет. Кстати, здесь пропущен
break
, поэтому после инструкции программа еще и выдает что «Выбран неверный пункт меню!»:После того, как наконец-то, после анализа кода программы, добрались до «инструкции», выясняется, что «2-Подсчет количества единичных значений битов» в действительности означает «Подсчитать количество единичных значений битов, стоящих на четных позициях». Классное уточнение! По пункту 3 — аналогично.
Ладно, с тем, что программа реально должна делать, разобрались.
В меню вводим 3. Подозреваю, что без ввода числа ничего не выйдет, но меню — есть меню, и оно предоставляет свободу выбора. «Сначала выполните пункт 2». Хм... Оказывается надо сначала подсчитать количество единичных битов в четных позициях. Загадочно... В меню вводим 2. Ну вот оно, таки надо сначала ввести число. Слава Богу, что «4-Завершение работы» работает без выполнения пунктов 3, 2 и 1.
Ты скажи, зачем ты такой пользовательский интерфейс наклепал? Тренировался в наборе текста слепым десятипальцевым методом? Здесь совершенно явно просматривается линейное выполнение программы: ввод числа, подсчет битов, сдвиг, завершение. Или, если уж очень хочется, этот линейный кусок завернуть в цикл do-while с запросом на продолжение. В итоге код программы сокращается в 2 раза.
Теперь по остальному тексту программы.
Если ты используешь вызовы из
stdio.h
, зачем включатьiostream
? Видимо радиsystem()
иsetlocale()
. Один удар микроскопом — и гвоздь забит. Изящно )) Но такой код компилятором С (не ++) не скомпилируется. А программа, похоже, написана на чистом С. Если не полениться, и почитать доки, то проблема решается например так:Подобрались к самому интересному: циклический сдвиг вправо в старшей тетраде целого числа. Что такое целое число? Как выяснилось из текста программы, под целым числом ты подразумеваешь 16-битное целое со знаком. А почему не 8-, 32- или 64-битное? Это либо надо как-то оговаривать, либо писать программу так, что бы она корректно работала со старшей тетрадой числа вне зависимости от архитектуры компьютера, разрядности ОС и настроек компилятора.
Я долго медитировал над твоей функцией
shift()
. Наконец до меня дошло, что под тетрадой ты понимаешь любую непрерывную последовательность из четырёх бит, а не ниббл (полубайт), как это принято. Поэтому, исходя из твоего предположения о тетраде, функция работает правильно, исходя из общепринятого — нет (это еще учитывая предположение, что int — 16-битный!).