Сдвиг в си

Можно, например, так:

#include <iostream>
#include <iomanip>

using namespace std;

void binp(ostream& os, unsigned int n) {
    if (n != 0) {
        binp(os, n >> 1);
        os << (n & 1);
    }
    else {
        os << "0b0";
    }
}

int main() {

    setlocale(LC_ALL, ".1251");

    int num;
    cout << "Введите целое число: ";
    cin >> num;

    cout << "Получено: 0x" << hex << num << "\t";
    binp(cout, num);
    cout << endl;

    int carry;
    for (int i = 0; i < 4; i++) {
        // циклический сдвиг младшей тетрады вправо -- начало
        carry = num & 1;
        num = ((num & 0xf) >> 1) | (num & ~0xf);
        if (carry) {
            num |= 0x8;
        }
        // циклический сдвиг младшей тетрады вправо -- конец
        cout << i+1 << "  0x" << hex << num << "\t";
        binp(cout, num);
        cout << endl;
    }

    return 0;
}

Переменная carry содержит младший бит, который должен быть перенесён в старшую позицию тетрады.

(num & 0xf) — выделена младшая тетрада
(num & 0xf) >> 1 — младшую тетраду сдвинули на один бит вправо
(num & ~0xf) — сбросить биты младшей тетрады в 0
Осталось сложить получившееся вместе и установить старший бит тетрады, если carry не равна 0.

Хорошее число 3276 ;)

Nikita1881, сам-то своей программой пробовал пользоваться? Удобно? Я — так просто охренел от такого пользовательского интерфейса.

Начинаем сначала: запускаем программу. «Перед началом использования программы ознакомьтесь с инструкцией». «О'кей, Гугл! Инструкция к программе...» Т.е. я хотел узнать, а где, собственно, инструкция? Оказывается на пункте меню 5, которого в меню нет. Кстати, здесь пропущен break, поэтому после инструкции программа еще и выдает что «Выбран неверный пункт меню!»:

       case 5:
            f_help();
            break;              // <-- !!!
        default:
        {
            puts("Выбран неверный пункт меню!");
            system("pause");
            break;
        }

После того, как наконец-то, после анализа кода программы, добрались до «инструкции», выясняется, что «2-Подсчет количества единичных значений битов» в действительности означает «Подсчитать количество единичных значений битов, стоящих на четных позициях». Классное уточнение! По пункту 3 — аналогично.

Ладно, с тем, что программа реально должна делать, разобрались.

В меню вводим 3. Подозреваю, что без ввода числа ничего не выйдет, но меню — есть меню, и оно предоставляет свободу выбора. «Сначала выполните пункт 2». Хм... Оказывается надо сначала подсчитать количество единичных битов в четных позициях. Загадочно... В меню вводим 2. Ну вот оно, таки надо сначала ввести число. Слава Богу, что «4-Завершение работы» работает без выполнения пунктов 3, 2 и 1.

Ты скажи, зачем ты такой пользовательский интерфейс наклепал? Тренировался в наборе текста слепым десятипальцевым методом? Здесь совершенно явно просматривается линейное выполнение программы: ввод числа, подсчет битов, сдвиг, завершение. Или, если уж очень хочется, этот линейный кусок завернуть в цикл do-while с запросом на продолжение. В итоге код программы сокращается в 2 раза.

Теперь по остальному тексту программы.

#include<stdio.h>
#include<iostream>

Если ты используешь вызовы из stdio.h, зачем включать iostream? Видимо ради system() и setlocale(). Один удар микроскопом — и гвоздь забит. Изящно )) Но такой код компилятором С (не ++) не скомпилируется. А программа, похоже, написана на чистом С. Если не полениться, и почитать доки, то проблема решается например так:

#include <stdio.h>
#include <locale.h>
#include <stdlib.h>

Подобрались к самому интересному: циклический сдвиг вправо в старшей тетраде целого числа. Что такое целое число? Как выяснилось из текста программы, под целым числом ты подразумеваешь 16-битное целое со знаком. А почему не 8-, 32- или 64-битное? Это либо надо как-то оговаривать, либо писать программу так, что бы она корректно работала со старшей тетрадой числа вне зависимости от архитектуры компьютера, разрядности ОС и настроек компилятора.

Я долго медитировал над твоей функцией shift(). Наконец до меня дошло, что под тетрадой ты понимаешь любую непрерывную последовательность из четырёх бит, а не ниббл (полубайт), как это принято. Поэтому, исходя из твоего предположения о тетраде, функция работает правильно, исходя из общепринятого — нет (это еще учитывая предположение, что int — 16-битный!).

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.