1 Востаннє редагувалося Komiks (29.11.2013 20:50:07)

Тема: Бітова операція

Є код. Він правильний, але викладач сказав написати його в бітових операціях. Підкажіть,будь ласка, як це зробити


#include <iostream>
using namespace std;

int X = sizeof(long)*8;
char * getBits(long val)
{
    char * Bits = new char[X + 1];
    for(int i = 0; i < X; i++)
    {
        Bits[X - i - 1] = '0' + val % 2;
        val             = val / 2;
    }
    Bits[X] = '\0';
    return Bits;
}

char * invBits(char * Bits, int P, int N)
{
    for(int i = P, bit; i < P + N + 1; i++)
    {
        bit = Bits[X - i - 1] - '0';
        Bits[X - i - 1] = '0' + !bit;
    }
    return Bits;
}

long getNumFromBits(char * Bits)
{
    long pwr = 2;
    long val = (Bits[X - 1] - '0');
    for(int i = 1; i < X; i++)
    {
        val = val + pwr*(Bits[X - i - 1] - '0');
        pwr = pwr*2;
    }
    return val;
}

int main()
{
    int N, P;
    long val;
    char * Bits;
    cout<<"enter number : ";cin>>val;
    cout<<"enter N : ";cin>>N;
    cout<<"enter P : ";cin>>P;
    if(X < N + P + 1)
        cout<<"Chislo bitov k invertirovaniu prevoshodit razmer bitov v chisle\n";
    else
    {
        if(!(Bits = getBits(val)))
            cout<<"error get bit mask of number\n";
        else
        {
            cout<<"input  bits in number  : "<<Bits<<endl;
            Bits = invBits(Bits, P, N);
            cout<<"invert bits in number  : "<<Bits<<endl;
            val = getNumFromBits(Bits);
            cout<<"number with invert bits: "<<val<<endl;
            delete [] Bits;
        }
    }
    system("pause");
    return 0

2

Re: Бітова операція

1. Юзайте тег code.
2. Якщо цей код правильний, то в чому проблема? А якщо неправильний - то напишіть, що він має робити.

3 Востаннє редагувалося Komiks (29.11.2013 20:21:12)

Re: Бітова операція

Написати функцію, яка повертає число, одержане з цілого числа x, в
якому інвертовані n розрядів, починаючи з позиції p, а решта розрядів
залишені без змін (крайній правий біт вважати нульовим за номером).
Перевіряти правильність значень n і p
Ось це завдання.
Код працює вірно,але коли я здавав його викладачу він сказав ,що  у цьому проміжку

#include <iostream>
using namespace std;

int X = sizeof(long)*8;
char * getBits(long val)
{
    char * Bits = new char[X + 1];
    for(int i = 0; i < X; i++)
    {
        Bits[X - i - 1] = '0' + val % 2;
        val             = val / 2;
    }
    Bits[X] = '\0';
    return Bits;
}

char * invBits(char * Bits, int P, int N)
{
    for(int i = P, bit; i < P + N + 1; i++)
    {
        bit = Bits[X - i - 1] - '0';
        Bits[X - i - 1] = '0' + !bit;
    }
    return Bits;
}
 
long getNumFromBits(char * Bits)
{
    long pwr = 2;
    long val = (Bits[X - 1] - '0');
    for(int i = 1; i < X; i++)
    {
        val = val + pwr*(Bits[X - i - 1] - '0');
        pwr = pwr*2;
    }
    return val;
}

Зробити в бітових операціях.
Я так зрозумів треба усі ціфрі перевести у двійкову систему?
А що таке тег код я не знаю)

4 Востаннє редагувалося Logans (29.11.2013 20:33:37)

Re: Бітова операція

А тег code, це ось така "штучка" і має ось такий принцип

Виглядає так:

#include "stdafx.h"
#include <iostream>

using namespace std;

int main()
{
    return 0;
}

Для громіздкого коду рекомендується також використовувати тег spoiler.

Принцип використання такий.

Приклад використання:

Прихований текст
#include "stdafx.h"
#include <iostream>

using namespace std;

int main()
{
    return 0;
}
Подякували: Chemist-i1

5

Re: Бітова операція

Logans написав:

А тег code, це ось така "штучка" і використовується вона так

Виглядає так:

#include "stdafx.h"
#include <iostream>

using namespace std;

int main()
{
    return 0;
}

Для громіздкого коду рекомендується також використовувати тег spoiler.

Принцип використання такий.

Приклад використання:

Прихований текст
#include "stdafx.h"
#include <iostream>

using namespace std;

int main()
{
    return 0;
}

Так бітову операцію зробити не з тег кодом не можна?

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

6 Востаннє редагувалося Logans (29.11.2013 20:35:37)

Re: Бітова операція

Тег код, використовується на форумах для покращення читабельності коду який представляють користувачі.
Ось наприклад ваш код повинен виглядати ось так:

Прихований текст
#include <iostream>
using namespace std;
int X = sizeof(long)*8;
char * getBits(long val)
{
    char * Bits = new char[X + 1];
    for(int i = 0; i < X; i++)
    {
        Bits[X - i - 1] = '0' + val % 2;
        val             = val / 2;
    }
    Bits[X] = '\0';
    return Bits;
}
char * invBits(char * Bits, int P, int N)
{
    for(int i = P, bit; i < P + N + 1; i++)
    {
        bit = Bits[X - i - 1] - '0';
        Bits[X - i - 1] = '0' + !bit;
    }
    return Bits;
}
long getNumFromBits(char * Bits)
{
    long pwr = 2;
    long val = (Bits[X - 1] - '0');
    for(int i = 1; i < X; i++)
    {
        val = val + pwr*(Bits[X - i - 1] - '0');
        pwr = pwr*2;
    }
    return val;
}

Це стосується форуму, а не саме вашої програми.

7

Re: Бітова операція

Logans написав:

Тег код, використовується на форумах для покращення читабельності коду який представляють користувачі.
Ось наприклад ваш код повинен виглядати ось так:

Прихований текст
#include <iostream>
using namespace std;
int X = sizeof(long)*8;
char * getBits(long val)
{
    char * Bits = new char[X + 1];
    for(int i = 0; i < X; i++)
    {
        Bits[X - i - 1] = '0' + val % 2;
        val             = val / 2;
    }
    Bits[X] = '\0';
    return Bits;
}
char * invBits(char * Bits, int P, int N)
{
    for(int i = P, bit; i < P + N + 1; i++)
    {
        bit = Bits[X - i - 1] - '0';
        Bits[X - i - 1] = '0' + !bit;
    }
    return Bits;
}
long getNumFromBits(char * Bits)
{
    long pwr = 2;
    long val = (Bits[X - 1] - '0');
    for(int i = 1; i < X; i++)
    {
        val = val + pwr*(Bits[X - i - 1] - '0');
        pwr = pwr*2;
    }
    return val;
}

Це стосується форуму, а не саме вашої програми.


ааа я зрозумів))

8

Re: Бітова операція

Допоможіть з цими бітами будь ласка(

9

Re: Бітова операція

Komiks написав:
Logans написав:

А тег code, це ось така "штучка" і використовується вона так

Виглядає так:

Прихований текст
#include "stdafx.h"
#include <iostream>

using namespace std;

int main()
{
    return 0;
}

Для громіздкого коду рекомендується також використовувати тег spoiler.

Принцип використання такий.

Приклад використання:

Прихований текст
#include "stdafx.h"
#include <iostream>

using namespace std;

int main()
{
    return 0;
}

Так бітову операцію зробити не з тег кодом не можна?

це варте того, щоб заскриніти, лол)

Подякували: Chemist-i, incred2

10

Re: Бітова операція

Cyan написав:
Komiks написав:
Logans написав:

А тег code, це ось така "штучка" і використовується вона так

Виглядає так:

Прихований текст
#include "stdafx.h"
#include <iostream>

using namespace std;

int main()
{
    return 0;
}

Для громіздкого коду рекомендується також використовувати тег spoiler.

Принцип використання такий.

Приклад використання:

Прихований текст
#include "stdafx.h"
#include <iostream>

using namespace std;

int main()
{
    return 0;
}

Так бітову операцію зробити не з тег кодом не можна?

це варте того, щоб заскриніти, лол)

Я вивчаю програмування всього 2 місяці) Можете скриніти,але допоможіть будь ласка)

11

Re: Бітова операція

Вам, здається, вже відповіли в цій гілці: формуєте маску (за допомогою зсувів) і XOR-ите ваше число:

x^=(1<<(n+1)-1)<<p;

12

Re: Бітова операція

-Вам треба знати що число типу Int зберігається як послідовність бітів і з ним можна робити бітові операції.
- ось бітові операції http://uk.wikipedia.org/wiki/%D0%91%D1% … 1%96%D1%97