Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.03.2021, 15:39   #1
GrimHex
Пользователь
 
Аватар для GrimHex
 
Регистрация: 14.08.2019
Сообщений: 65
По умолчанию Как не занулять пустые биты в битовых операциях?

**Как не занулять пустыми битами в битовых операциях?**

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

Код:
#include <iostream>

unsigned long long acceptor = 1234567890;
unsigned long long acceptor2 = 1234567890;
int long value_ch = 'A';
int long offset = 8;
int long offset2 = 8;
int main() 
{
	std::cout << acceptor << "\n";
	std::cout << char(acceptor) << "\n";
	acceptor = (value_ch << offset);		// Предполагается запись пустых битов
	std::cout << acceptor << "\n";
	std::cout << char(acceptor) << "\n";
	std::cout << acceptor2 << "\n";
	std::cout << char(acceptor2) << "\n";
	acceptor2 |= (value_ch << offset2);		// Предполагается пропуск пустых битов
	std::cout << acceptor2 << "\n";
	std::cout << char(acceptor2) << "\n";
	return 0;
}
Результат исполнения:

1234567890

16640

1234567890

1234584530


Объясните, пож., занулились ли старшие биты в третем по счету консольном выводе?
И вообще, как правилнее продемонстрировать это?

Последний раз редактировалось GrimHex; 14.03.2021 в 16:41.
GrimHex вне форума Ответить с цитированием
Старый 14.03.2021, 17:00   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
#include <iostream>
#include <iomanip>

using namespace std;

unsigned long long acceptor = 1234567890;
unsigned long long acceptor2 = 1234567890;
int long value_ch = 'A';
int long offset = 8;
int long offset2 = 8;

int main()
{
    ios state(nullptr);
    state.copyfmt(cout);
    cout << "before: " << acceptor << " (0x" << hex << uppercase << setw(8) << setfill('0') << acceptor << ")" << endl;
    cout.copyfmt(state);
    acceptor = (value_ch << offset); // Предполагается запись пустых битов
    cout << "after:" << acceptor << " (0x" << hex << uppercase << setw(8) << setfill('0') << acceptor << ")" << endl;
    cout.copyfmt(state);
    cout << "before: " << acceptor2 << " (0x" << hex << uppercase << setw(8) << setfill('0') << acceptor2 << ")" << endl;
    cout.copyfmt(state);
    acceptor2 |= (value_ch << offset2); // Предполагается пропуск пустых битов
    cout << "after:" << acceptor2 << " (0x" << hex << uppercase << setw(8) << setfill('0') << acceptor2 << ")" << endl;
    return 0;
}
В виде шестнадцатеричного числа лучше видно, какие биты изменились.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 14.03.2021, 18:55   #3
GrimHex
Пользователь
 
Аватар для GrimHex
 
Регистрация: 14.08.2019
Сообщений: 65
По умолчанию

Спасибо за ответ. Поставил единицы, так еще проще.

before: 1111111111 (0x423A35C7)
after:16640 (0x00004100) //Запись с нулями, вычисленя значения не произошли.
before: 1111111111 (0x423A35C7)
after:1111127495 (0x423A75C7) //Запись без нулей, вычисления значений произошли. 75C7-35C7=4000

Разница: сначала - 4100, потом 4000. Именно поэтому написал что произошло вычисление значения.

Нужно чтобы (одновременно):
1. Записываемое значение не вычислялось (арифметические преобразования)
2. Не записывались старшие ноли.

Насколько это усложнит реализацию?

Последний раз редактировалось GrimHex; 14.03.2021 в 19:05.
GrimHex вне форума Ответить с цитированием
Старый 15.03.2021, 07:33   #4
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

Цитата:
Сообщение от GrimHex Посмотреть сообщение
Записываемое значение не вычислялось
так не бывает, выражение всегда вычисляется ) Иногда - на этапе компиляции

Цитата:
Сообщение от GrimHex Посмотреть сообщение
Не записывались старшие ноли.
у меня такое ощущение, что тут нужны битовые поля

но изначальная задача поставлена непонятно. Неизвестно, что автор хочет добиться
Алексей1153 вне форума Ответить с цитированием
Старый 15.03.2021, 22:23   #5
GrimHex
Пользователь
 
Аватар для GrimHex
 
Регистрация: 14.08.2019
Сообщений: 65
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
но изначальная задача поставлена непонятно. Неизвестно, что автор хочет добиться
Нужен простой парсинг датаграмм: замена полей, обнуление полей, установка всех единиц в поле. С новыми полями разных типов данных.

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

Последний раз редактировалось GrimHex; 15.03.2021 в 23:05.
GrimHex вне форума Ответить с цитированием
Старый 15.03.2021, 23:33   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Алексей1153 оказался прав. Почитайте про битовые поля. Опишите структуры с нужными полями для датаграмм.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 17.03.2021, 12:04   #7
GrimHex
Пользователь
 
Аватар для GrimHex
 
Регистрация: 14.08.2019
Сообщений: 65
По умолчанию

Теперь с битовыми полями. А битовые операции все равно не получаются.

Вот что выдала консоль:

Enter acceptor value: 1111111
Enter writing value: AAAAAA
Enter offset value: 8
(Writing value is Long)
(Offset value is Char )
AcceptorInput: 17895697 (0x01111111)
WritingInput: AAAAAA (0x00AAAAAA)
OffsetInput: 8 (0x00000008)
New Acceptor value:CCCCCCCCEEEEEECC (0xCCCCCCCCEEEEEECC)
OLd Acceptor value:1111111 (0x01111111)

Код:
#include <iostream>
#include <iomanip>

using namespace std;

class Value {

public:

    unsigned long long AcceptorInput = 0;
    unsigned long long WritingInput = 0;
    unsigned long OffsetInput = 0;

    unsigned long long AcceptorBfInputLL : 64;

    bool WritingBfInputB : 1;
    unsigned char WritingBfInputCh : 8;
    unsigned short WritingBfInputSh : 16;
    unsigned long WritingBfInputL : 32;
    unsigned long long WritingBfInputLL : 64;

    bool OffsetBfInputB : 1;
    unsigned char OffsetBfInputCh : 8;
    unsigned short OffsetBfInputSh : 16;
    unsigned long OffsetBfInputL : 32;
    unsigned long long OffsetBfInputLL : 64;

    /*Считать: датаграмму-приемник, записываемое значение, и смещение*/

    void GetInput() {
        ios state(nullptr);
        state.copyfmt(cout);
        cout << "Enter acceptor value: ";
        state.copyfmt(cin);
        cin >> hex >> uppercase >> setw(8) >> setfill('0') >> AcceptorInput;
        state.copyfmt(cout);
        cout << "Enter writing value: ";
        state.copyfmt(cin);
        cin >> hex >> uppercase >> setw(8) >> setfill('0') >> WritingInput;
        state.copyfmt(cout);
        cout << "Enter offset value: ";
        state.copyfmt(cin);
        cin >> hex >> uppercase >> setw(8) >> setfill('0') >> OffsetInput;
    };

    /*Проверка введенного значения для записываемого значения*/

    unsigned long long CheckWritingInput() {
        if (1 >= WritingInput) { WritingBfInputB = WritingInput; return 2; }
        else if (255 >= WritingInput) { WritingBfInputCh = WritingInput; return 3; }
        else if (65535 >= WritingInput) { WritingBfInputSh = WritingInput; return 4; }
        else if (4294967295 >= WritingInput) { WritingBfInputL = WritingInput; return 5; }
        else if (18446744073709551615 >= WritingInput) { WritingBfInputLL = WritingInput; return 6; }
        else { return 0; };
    };

    /*Проверка введенного значения для смещения*/

    unsigned long CheckOffsetInput() {
        if (1 >= OffsetInput) { OffsetBfInputB = OffsetInput; return 2; }
        else if (255 >= OffsetInput) { OffsetBfInputCh = OffsetInput; return 3; }
        else if (65535 >= OffsetInput) { OffsetBfInputSh = OffsetInput; return 4; }
        else if (4294967295 >= OffsetInput) { OffsetBfInputL = OffsetInput; return 5; }
        else { return 0; };
    };

    /*Вывод наименований введенных типов*/

    void EnteredValues() {
        if (2 == CheckWritingInput()) { cout << "(Writing value is Bool)" << endl; }
        else if (3 == CheckWritingInput()) { cout << "(Writing value is Char)" << endl; }
        else if (4 == CheckWritingInput()) { cout << "(Writing value is Short)" << endl; }
        else if (5 == CheckWritingInput()) { cout << "(Writing value is Long)" << endl; }
        else if (6 == CheckWritingInput()) { cout << "(Writing value is Long)" << endl; }
        else { cout << "(Value is unknown)" << endl; };
        if (2 == CheckOffsetInput()) { cout << "(Offset value is Bool )" << endl; }
        else if (3 == CheckOffsetInput()) { cout << "(Offset value is Char )" << endl; }
        else if (4 == CheckOffsetInput()) { cout << "(Offset value is Short )" << endl; }
        else if (5 == CheckOffsetInput()) { cout << "(Offset value is Long )" << endl; }
        else { cout << "(Value is unknown)" << endl; };
    };

    /*Битовые операции с полученными значениями*/

    void CalcInput() {
        if (2 == CheckWritingInput()) {
            if (2 == CheckOffsetInput()) { AcceptorBfInputLL |= (WritingBfInputB << OffsetBfInputB); }
            else if (3 == CheckOffsetInput()) { AcceptorBfInputLL |= (WritingBfInputB << OffsetBfInputCh); }
            else if (4 == CheckOffsetInput()) { AcceptorBfInputLL |= (WritingBfInputB << OffsetBfInputSh); }
            else if (5 == CheckOffsetInput()) { AcceptorBfInputLL |= (WritingBfInputB << OffsetBfInputL); }
        };
        if (3 == CheckWritingInput()) {
            if (2 == CheckOffsetInput()) { AcceptorBfInputLL |= (WritingBfInputCh << OffsetBfInputB); }
            else if (3 == CheckOffsetInput()) { AcceptorBfInputLL |= (WritingBfInputCh << OffsetBfInputCh); }
            else if (4 == CheckOffsetInput()) { AcceptorBfInputLL |= (WritingBfInputCh << OffsetBfInputSh); }
            else if (5 == CheckOffsetInput()) { AcceptorBfInputLL |= (WritingBfInputCh << OffsetBfInputL); }
        };
        if (4 == CheckWritingInput()) {
            if (2 == CheckOffsetInput()) { AcceptorBfInputLL |= (WritingBfInputSh << OffsetBfInputB); }
            else if (3 == CheckOffsetInput()) { AcceptorBfInputLL |= (WritingBfInputSh << OffsetBfInputCh); }
            else if (4 == CheckOffsetInput()) { AcceptorBfInputLL |= (WritingBfInputSh << OffsetBfInputSh); }
            else if (5 == CheckOffsetInput()) { AcceptorBfInputLL |= (WritingBfInputSh << OffsetBfInputL); }
        };
        if (5 == CheckWritingInput()) {
            if (2 == CheckOffsetInput()) { AcceptorBfInputLL |= (WritingBfInputL << OffsetBfInputB); }
            else if (3 == CheckOffsetInput()) { AcceptorBfInputLL |= (WritingBfInputL << OffsetBfInputCh); }
            else if (4 == CheckOffsetInput()) { AcceptorBfInputLL |= (WritingBfInputL << OffsetBfInputSh); }
            else if (5 == CheckOffsetInput()) { AcceptorBfInputLL |= (WritingBfInputL << OffsetBfInputL); }
        };
        if (6 == CheckWritingInput()) {
            if (2 == CheckOffsetInput()) { AcceptorBfInputLL &= ~(WritingBfInputL << OffsetBfInputB); }
            else if (3 == CheckOffsetInput()) { AcceptorBfInputLL |= (WritingBfInputLL << OffsetBfInputCh); }
            else if (4 == CheckOffsetInput()) { AcceptorBfInputLL |= (WritingBfInputLL << OffsetBfInputSh); }
            else if (5 == CheckOffsetInput()) { AcceptorBfInputLL |= (WritingBfInputLL << OffsetBfInputL); }
        };
    };

};

/*Вызов членов и вывод результатов вычислений*/

int main() {
    Value a;
    a.GetInput();
    a.CheckWritingInput();
    a.CheckOffsetInput();
    a.EnteredValues();
    a.CalcInput();
    ios state(nullptr);
    state.copyfmt(cout);
    cout << "AcceptorInput: " << a.AcceptorInput << " (0x" << hex << uppercase << setw(8) << setfill('0') << a.AcceptorInput << ")" << endl;
    state.copyfmt(cout);
    cout << "WritingInput: " << a.WritingInput << " (0x" << hex << uppercase << setw(8) << setfill('0') << a.WritingInput << ")" << endl;
    state.copyfmt(cout);
    cout << "OffsetInput: " << a.OffsetInput << " (0x" << hex << uppercase << setw(8) << setfill('0') << a.OffsetInput << ")" << endl;
    state.copyfmt(cout);
    cout << "New Acceptor value:" << a.AcceptorBfInputLL << " (0x" << hex << uppercase << setw(8) << setfill('0') << a.AcceptorBfInputLL << ")" << endl;
    state.copyfmt(cout);
    cout << "OLd Acceptor value:" << a.AcceptorInput << " (0x" << hex << uppercase << setw(8) << setfill('0') << a.AcceptorInput << ")" << endl;
    return 0;
};
GrimHex вне форума Ответить с цитированием
Старый 17.03.2021, 12:30   #8
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

GrimHex, какой формат пакета? Явно неправильно используешь битовые поля. Почему базовый тип всё время разный то ?
Алексей1153 вне форума Ответить с цитированием
Старый 17.03.2021, 12:51   #9
GrimHex
Пользователь
 
Аватар для GrimHex
 
Регистрация: 14.08.2019
Сообщений: 65
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
GrimHex, какой формат пакета?
unsigned long long

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
Явно неправильно используешь битовые поля. Почему базовый тип всё время разный то ?
Вроде базовый "unsigned long long AcceptorBfInputLL : 64;"
Еще есть временная переменная с исходным "unsigned long long AcceptorInput = 0;"

Для смещения и записываемого значения тип данных не определен, поэтому работаю со всеми беззнаковыми.
GrimHex вне форума Ответить с цитированием
Старый 17.03.2021, 13:17   #10
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

GrimHex, то есть, формата нет ещё? Ну хотя бы на словах - что должно быть в пакете
Алексей1153 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
в переменной типа word (b15b14...b1b0) биты 0..4 содержат двоичный код ,который обозначим как А,биты 5..7-код,который обозначим ка Юлия123456 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 07.06.2016 06:33
как разбить текст на биты......... Xchel Помощь студентам 17 17.04.2016 22:05
Как получить средние биты 32х битного числа? Larboss Общие вопросы Delphi 7 23.05.2013 10:05
Как перевести биты в мегабайты? Юзер7 Свободное общение 7 19.06.2009 17:27
Как избавиться от зависания приложения при выполнении длительных операциях Des Общие вопросы Delphi 15 30.04.2009 02:05