1 Востаннє редагувалося Joker (19.08.2014 23:11:30)

Тема: Побітові операції

Я не впевнений, чи я все правильно розумію.
За звичайних умов С++ приймає числа у 10 системі числення. Але, робота з іншими також досить проста.

код

#include <iostream>
#include <conio.h>
using namespace std;

int main()
{
    int a = 25;
    int b = 025;

    cout << " a = " << a << endl;
    cout << " b = " << b << endl;

    _getch();
    return 0;
}

Мої твердження:
Змінна a записана у 10 системі числення.
Зміна b переводить число 25 з 8 системи числення у 10 систему. І тут воно перетворюється на 21

Тут все правильно?
І ще одне суто для мене, опитування

2 Востаннє редагувалося Joker (18.08.2014 22:06:32)

Re: Побітові операції

код v.0.2
#include <iostream>
#include <conio.h>
using namespace std;

int main()
{
    int a = 25;
    int b = 025;
    int c = 0xaa;

    cout << " a = " << a << endl;
    cout << " b = " << b << endl;
    cout << " c = " << c << endl;

    _getch();
    return 0;
}

Відповідно змінна c переведе 0xaa з 16 системи у 10 систему і виведе 170

Якщо я щось не правильно кажу, виправіть мене будь ласка.

3

Re: Побітові операції

Змінні нічого не переводять. Змінні зберігають значення у внутрішньому форматі (який найлегше уявити собі як двійковий - або як набір байтів, яким він власне і є).
Запис int a = 25; означає "створити змінну a, значення якої дорівнює літералу 25". При цьому літерал перетворюється з десяткового на внутрішній формат ще компілятором, до початку виконання програми. А от оператор std::ostream::operator<<(int) перетворює операнд з внутрішнього формату на рядок байтів, який містить символи, що відповідають десятковому запису числа, і виводить ці символи. Щось незрозуміло?

Подякували: Joker1

4

Re: Побітові операції

Ну про змінні я знав, це так просто писав на швидку руку. Але суть усіх цих перетворень я вказав правильно.
0 (нуль) каже, що число набране у 8 системі, і тоді воно переводиться у 10 сис.
0x те саме, тільки з 16 сис.

Якщо це повідомлення правильно, то заки все зрозуміло. Але для мене тема бінових операцій, продовжується, тому я збираюсь тут писати далі, про незрозумілі мені речі.

5

Re: Побітові операції

0 (нуль) каже, що число набране у 8 системі, і тоді воно переводиться у 10 сис.

Іще раз - воно ніяк не перетворюється, а виводиться одержаний результат в десятичній системі числення тільки тому, що ви самі її обрали.

6

Re: Побітові операції

ок, заки все зрозумів.

7

Re: Побітові операції

Ось у цьому коді я вклав усі свої знання з цієї теми.
Напишіть де, щось не так.

код
#include <iostream>
#include <conio.h>
using namespace std;

typedef unsigned int ui;

int main()
{
    int a = 25; // 10 система числення
    int b = 025; // Число 25 введено у 8 системі. При виводі на екран ми побачимо 21. Число 25 у 8 системі = числу 21 у 10 системі
    int c = 0xff; // ff 255. Число ff введено у 16 системі. На екрані 255, оскільки при переденні ff у 10 систему отримаємо 255

    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    cout << "c = " << c << endl;

    ui p = 25; // 0000 0000 0000 0000 0000 0000 0001 1001
    ui q = 12; // 0000 0000 0000 0000 0000 0000 0000 1100

    // Побітове не (~)
    cout << "\n\n~p = " << ~p << endl;    // Всі 0 біти зміняться на 1. А біти рівні 1 - на 0
        /*  0000 0000 0000 0000 0000 0000 0001 1001
        ~  --------------------------------------------------
            1111 1111 1111 1111 1111 1111 1110 0110
            Це дорівнює числу 4294967270. Але пам'ятайте,що я працюю тільки з невід'ємними числами
        */
        
    // Побітове I (&)
    // Результатом буде 1, коли біти обох чисел дорівнюють 0. Комбінація 1-1
    cout << "p & q = " << (p&q) << endl;
    /*0000 0000 0000 0000 0000 0000 0001 1001
    &
      0000 0000 0000 0000 0000 0000 0000 1100
    -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
      0000 0000 0000 0000 0000 0000 0000 1000 Це дорівнює 8
    */

    // Побітове Або (|)
    cout << "p | q = " << (p|q) << endl; // Результат 1, коли хоча б 1 з бітів дорівнює 1. Тобто комбінації 0-1; 1-0; 1-1

    /*0000 0000 0000 0000 0000 0000 0001 1001
    |
    0000 0000 0000 0000 0000 0000 0000 1100
    -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    0000 0000 0000 0000 0000 0000 0001 1101*/

    // Побітове виключаюче Або (^)
    //Тут ми отримаємо 1, тільки якщо тільки 1 з бітів буде дорівнювати 1, а інший 0. 1 - 0; 0-1
    /*0000 0000 0000 0000 0000 0000 0001 1001
    ^
      0000 0000 0000 0000 0000 0000 0000 1100
    -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
      0000 0000 0000 0000 0000 0000 0001 0101 = 29*/ 

    // Побітовий зсув ліворуч (<<)
    // Зсуває певну к-сть останіх бітів ліворуч
    cout << "p << 3 = " << (p << 3) << endl;
    //0000 0000 0000 0000 0000 0000 0001 1001
    //<< 
    //0000 0000 0000 0000 0000 0000 1100 1000 = 200
    // Перші біти пропадають, а біти які з'явилися у кінці заповнюються 0
    // p << 3. Означає взяти і у кінці додати три 0 біти. А спереду забрати перші 3 біти.
    // Аналогічно працює побітовий зсув праворуч (>>)
    cout << "p >> 3 = " << (p>>3) << endl;
    //0000 0000 0000 0000 0000 0000 0001 1001
    //>>
    //0000 0000 0000 0000 0000 0000 0000 0011|001 = 3
    _getch();
    return 0;
}

8 Востаннє редагувалося Joker (23.05.2015 13:12:17)

Re: Побітові операції

Знову розв'язував задачу з використаннями різних систем числень.

умова

Написати функцію яка отримує в якості аргументу ціле додатнє число і систему числення (в яку дане число треба перевести (системи числення від 2 до 32). Наприклад:
26 у систему 16 --> 1B; 13 у систему 5 --> 23; 35 у 18 систему --> 1H

Я знав, що у С++ є 0x - для 16 системи числення і 0 - для 8. Але цього замало.
В результаті получилося щось таке

код
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

vector<int> arr;

void Change(int a, int b);
char Let(int z);

int main()
{
    system("color A");
    setlocale(LC_CTYPE, "ukr");

    int x, y;

    cout << "\n" << "Введiть число --> ";
    cin >> x;
    cout << "\n" << "Введiть основу --> ";
    cin >> y;
    Change(x, y);

    cout << "\n\n" << "Результат = ";
    for (int i = arr.size() - 1; i >= 0; --i)
    {
        if (arr[i] > 9)
            cout << Let(arr[i]);
        else
            cout << arr[i];
    }

    cout << endl;
    system("pause");
    return 0;
}

void Change(int a, int b)
{
    while (a!=0)
    {
        arr.push_back(a%b);
        a /= b;
    }
}

char Let(int z)
{
    // 65 - координати літери A у системі
    /*
    char a = 'A';
    cout << (int) a;
    */
    return (char)z + 55;
}

Я все правильно розв'язав? Приклади наче пройшло.

9

Re: Побітові операції

Головне - щоб воно вас влаштовувало. Ось трохи зауважень:
- я б виніс переведення числа в цифру повністю в функцію (тобто if(x>9) має бути вже в цій функції).
- не пишіть коди знаків у вигляді чисел, якщо вам не треба саме з числами працювати - тобто тут має бути 'A'-10+z, тоді і коментар не потрібен.
- Глобальні змінні (як отой arr) - зло. Уникайте їх.

Подякували: Joker1