0 / 0 / 0
Регистрация: 18.03.2012
Сообщений: 30
1

Инвертирование группы бит.

18.03.2012, 15:26. Показов 4525. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите с программой, пожалуйста.

Дана переменная типа long. Написать функцию, которая инвертирует группу из N разрядов переменной, начиная с разряда с номером P (где N и P - целые положительные числа, а нумерация разрядов числа начинается с нуля). Запрещается использование дополнительных переменных.

В программе обеспечить ввод исходных данных.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.03.2012, 15:26
Ответы с готовыми решениями:

[Debug] Обнуление, установка и инвертирование бит
Привет, ребят, есть кто-то, кто шарит в Ассемблере. Нужна ваша помощь. Задание: Переменная x объявлена как слово. Создайте мнемокод...

При сложении по модулю два двух чисел по 48 бит пропадает 1 бит
Здравствуйте, помогите пожалуйста. В этой строке пропадает 1 бит, т.е. должно быть 48, а их 47. R =...

Самые часто встречающиеся 24 символа кодировать по 5 бит. А все остальные по 10 бит
Требуется: самые часто встречающиеся 24 символа кодировать по 5 бит. А все остальные по 10 бит. Дешифровка тоже нужна Помогите...

19
 Аватар для lemegeton
4893 / 2687 / 919
Регистрация: 29.11.2010
Сообщений: 5,774
18.03.2012, 18:06 2
Цитата Сообщение от kerzh Посмотреть сообщение
В программе обеспечить ввод исходных данных.
Это вот сами.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <string>
#include <limits>
 
std::string toBinary(unsigned long value, size_t bits =
  std::numeric_limits<unsigned long>::digits) {
  std::string result("");
  for (size_t i = 0; i < bits; ++i, value>>=1)
    result.insert(result.begin(), '0' + (value & 1));
  return result;
}
 
unsigned long invert(unsigned long value, size_t begin, size_t count) {
  return value ^ (std::numeric_limits<unsigned long>::max() >>
    (std::numeric_limits<unsigned long>::digits - count) << begin);
}
 
int main(int argc, char *argv[]) {
  unsigned long number = 817623877;
  std::cout << toBinary(number) << std::endl;
  std::cout << toBinary(invert(number, 1, 6)) << std::endl;
}
1
0 / 0 / 0
Регистрация: 18.03.2012
Сообщений: 30
18.03.2012, 18:43  [ТС] 3
Это вот сами.
это да.
мы потоки еще не проходили. пока на примитивном уровне все. это для меня сложно
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12837 / 7573 / 1765
Регистрация: 25.07.2009
Сообщений: 13,970
18.03.2012, 19:05 4
Лучший ответ Сообщение было отмечено как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <limits.h>
#include <math.h>
 
#ifndef LONG_BIT
#define LONG_BIT ( sizeof(long) * CHAR_BIT )
#endif
 
char * binstr(const unsigned long x){
    static char buf[LONG_BIT + 1] = { 0 };
    size_t i = LONG_BIT;
    char * p = buf;
    
    while ( i-- )
        *p++ = '0' + ( ( x >> i ) & 1 );
    
    return buf;
}
 
unsigned long invert(unsigned long x, size_t count, size_t pos){
    return x ^ ( (unsigned long)(pow(2.0, (double)count) - 1.0) << pos );
}
 
int main(void){
    unsigned long x;
    size_t pos, count;
    
    while ( printf("Number: ") && scanf("%lu", &x) == 1 && printf("Count: ") && scanf("%u", &count) == 1 && printf("Pos: ") && scanf("%u", &pos) == 1 && pos + count <= LONG_BIT ){
        printf("Before: %lu\t%s\n", x, binstr(x));
        x = invert(x, count, pos);
        printf("After:  %lu\t%s\n", x, binstr(x));
    }
    
    return 0;
}
3
 Аватар для lemegeton
4893 / 2687 / 919
Регистрация: 29.11.2010
Сообщений: 5,774
19.03.2012, 00:42 5
easybudda, хороший вариант. Без лишней информации.
Только зачем возводить двойку в степень через pow? Двойка в степень N же возводится сдвигом единицы влево 1 << N.
C
1
return x ^ (((1 << count) - 1) << pos);
Или я где-то не догоняю?
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12837 / 7573 / 1765
Регистрация: 25.07.2009
Сообщений: 13,970
19.03.2012, 02:13 6
Цитата Сообщение от lemegeton Посмотреть сообщение
Двойка в степень N же возводится сдвигом единицы влево
В случае, если нужно инвертировать все биты, двойка в степени LONG_BIT выйдет за границу типа unsigned long, то есть вот так
C
1
invert(x, LONG_BIT, 0);
уже не вызовешь. А какой вариант хуже - отлавливать отдельно этот случай, или просто на него забить, я так и не решил...
Хотя похоже, зря я испугался, сейчас проверю...

Проверил, работает. Тогда, конечно, лучше без заморочек с pow().
0
Эксперт С++
 Аватар для fasked
5044 / 2623 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
19.03.2012, 11:23 7
Ну и как вариант для массовки
C
1
2
3
4
unsigned long
invert(unsigned long x, unsigned long width, unsigned long offset) {
        return x ^ (~(0UL) << (LONG_BIT - width) >> (LONG_BIT - width - offset));
}
1
Автор FAQ
 Аватар для -=ЮрА=-
6612 / 4254 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
19.03.2012, 13:09 8
Цитата Сообщение от kerzh Посмотреть сообщение
Помогите с программой, пожалуйста.
Дана переменная типа long. Написать функцию, которая инвертирует группу из N разрядов переменной, начиная с разряда с номером P (где N и P - целые положительные числа, а нумерация разрядов числа начинается с нуля). Запрещается использование дополнительных переменных. В программе обеспечить ввод исходных данных.
- ниже простой алгоритм на плюсах работающий со строковым представлением бит, просто и наглядно
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream>
using namespace std;
 
int M = sizeof(long)*8;
char * getBits(long val)
{
    char * Bits = new char[M + 1];
    for(int i = 0; i < M; i++)
    {
        Bits[M - i - 1] = '0' + val % 2;
        val             = val / 2;
    }
    Bits[M] = '\0';
    return Bits;
}
 
char * invBits(char * Bits, int P, int N)
{
    for(int i = P, bit; i < P + N + 1; i++)
    {
        bit = Bits[M - i - 1] - '0';
        Bits[M - i - 1] = '0' + !bit;
    }
    return Bits;
}
 
long getNumFromBits(char * Bits)
{
    long pwr = 2;
    long val = (Bits[M - 1] - '0');
    for(int i = 1; i < M; i++)
    {
        val = val + pwr*(Bits[M - 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(M < 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;
}
Код проверен http://codepad.org/CnANX3pa
Миниатюры
Инвертирование группы бит.  
0
Автор FAQ
 Аватар для -=ЮрА=-
6612 / 4254 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
19.03.2012, 13:14 9
kerzh, небольшие пояснения к коду
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
char * getBits(long val)
{
* * * * char * Bits = new char[M + 1];
* * * * for(int i = 0; i < M; i++)
* * * * {
* * * * * * * * Bits[M - i - 1] = '0' + val % 2;
* * * * * * * * val * * * * * * = val / 2;
* * * * }
* * * * Bits[M] = '\0';
* * * * return Bits;
}
- получаем строку представление двоичной записи числа
(помните что двоичная запись идёт задом наперёд от привычной нам записи слева направо - т.е. младшие разряды числа будут идти ближе к концу)

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
char * invBits(char * Bits, int P, int N)
{
* * * * for(int i = P, bit; i < P + N + 1; i++)
* * * * {
* * * * * * * * bit = Bits[M - i - 1] - '0';
* * * * * * * * Bits[M - i - 1] = '0' + !bit;
* * * * }
* * * * return Bits;
}
- инвертируем нужное нам число бит с заданной позиции

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
long getNumFromBits(char * Bits)
{
* * * * long pwr = 2;
* * * * long val = (Bits[M - 1] - '0');
* * * * for(int i = 1; i < M; i++)
* * * * {
* * * * * * * * val = val + pwr*(Bits[M - i - 1] - '0');
* * * * * * * * pwr = pwr*2;
* * * * }
* * * * return val;
}
- получаем число из нового строкового представления

Остальное в алгоритме крайне тривиально и думаю в пояснениях не нуждается...
0
19.03.2012, 14:33 10

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
просто и наглядно
Звучит как "бесмысленно и беспощадно".

0
Автор FAQ
 Аватар для -=ЮрА=-
6612 / 4254 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
19.03.2012, 14:41 11
Цитата Сообщение от fasked Посмотреть сообщение
Звучит как "бесмысленно и беспощадно".
- лично мне на первом курсе всё что тут было приведено показалось бы именно
Цитата Сообщение от fasked Посмотреть сообщение
"бесмысленно и беспощадно"
. Я дал код в предположении кране скудных знаний у kerzh, вот и всё.

Не по теме:

PS:fasked, у меня что то неправильно посчиталось или не наглядно???

0
Эксперт С++
 Аватар для fasked
5044 / 2623 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
19.03.2012, 16:40 12
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Я дал код в предположении кране скудных знаний у kerzh, вот и всё.
Это то да. Просто переводить число в строку, чтобы работать с битами, это как-то странно В конце концов, надо же человека учить нормальным методам.
0
19.03.2012, 17:05 13

Не по теме:

fasked, сущность обучения - в постепенности осваиваемого материала, первокласнику не будет понятна производная, а 11 класнику не будет понятна теория поля с круговыми интегралами дивиргенциями и прочей вышкой, аналогично и здесь:read:

0
Автор FAQ
 Аватар для -=ЮрА=-
6612 / 4254 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
19.03.2012, 17:53 14
fasked, всё я тебя понял и так будет на много проще
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <iostream>
using namespace std;
 
int M = sizeof(long)*8;
char * getBits(char * Bits, long val)
{
    _asm
    {
        mov eax,val
        mov ebx,Bits
        mov ecx,32
        lop:
        rol eax,1
            jc m1
            mov [ebx],30h
            jmp m2
            m1:
            mov [ebx],31h
            m2:
            inc ebx
        loop lop
        mov [ebx],0
    }
    return Bits;
}
 
char * invBits(char * Bits, long val, int P, int N)
{
    val <<= (M - P + N);
    strrev(Bits);
    Bits = Bits + P;
    _asm
    {
        mov eax,val
        mov ebx,Bits
        mov ecx,N
        lopPN:
        rol eax,1
            jc mPN1
            mov [ebx],31h
            jmp mPN2
            mPN1:
            mov [ebx],30h
            mPN2:
            inc ebx
        loop lopPN
    }
    return strrev(Bits - P);
}
 
long getNumFromBits(char * Bits)
{
    long pwr = 2;
    long val = (Bits[M - 1] - '0');
    for(int i = 1; i < M; i++)
    {
        val = val + pwr*(Bits[M - i - 1] - '0');
        pwr = pwr*2;
    }
    return val;
}
 
int main()
{
    int N, P;
    long val;
    char * Bits = new char[M + 1];
    cout<<"enter number : ";cin>>val;
    cout<<"enter N : ";cin>>N;
    cout<<"enter P : ";cin>>P;
    if(M < N + P + 1)
        cout<<"Chislo bitov k invertirovaniu prevoshodit razmer bitov v chisle\n";
    else
    {
        cout<<"input  bits in number  : "<<getBits(Bits, val)<<endl;
        cout<<"invert bits in number  : "<<invBits(Bits, val, P, N)<<endl;
        cout<<"number with invert bits: "<<getNumFromBits(Bits)<<endl;
    }
    system("pause");
    return 0;
}
PS:За годы асм подзабыл, но обещаю в скором времени буду приводить "простенький код для начинающих" - уверен сейчас алгоритм стал на много понятней
Миниатюры
Инвертирование группы бит.  
0
19.03.2012, 17:55 15

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
rol eax,1
- fasked, чем не сдвиг - сдвиг, главное понятно то как стало новичкам:cofee:

0
Эксперт С++
 Аватар для fasked
5044 / 2623 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
19.03.2012, 18:01 16
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение

Не по теме:

- fasked, чем не сдвиг - сдвиг, главное понятно то как стало новичкам:cofee:

А самое смешное то, что алгоритм лучше не стал.
0
Автор FAQ
 Аватар для -=ЮрА=-
6612 / 4254 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
19.03.2012, 18:08 17
fasked, а я и не говорил что он станет лучше - ты вёл речь о понятности и сдвигах или rol это не сдвиг?
Что является критерием нормальности? Я вот держу пари что за все предложенные коды преподаватель впаяет kerzh, пару, т.к. 100% по его фразе
Цитата Сообщение от kerzh Посмотреть сообщение
это да. мы потоки еще не проходили. пока на примитивном уровне все. это для меня сложно
- он ещё начинающий и в таком случае даже строковая маска сложна, так что прежде чем что то цеплять нужно ориентироваться на уровень автора темы а не на то как должно быть всё в идеале. Да без базара, я сейчас сразу инверт напишу в одной функции на асме и будет строк 5-6 кода и что это проще или лучше автору будет???
0
Эксперт С++
 Аватар для fasked
5044 / 2623 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
19.03.2012, 22:26 18
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
ты вёл речь о понятности и сдвигах или rol это не сдвиг?
Я не вел речи о понятности или сдвигах.
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Да без базара, я сейчас сразу инверт напишу в одной функции на асме и будет строк 5-6 кода
Зачем?
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Я вот держу пари что за все предложенные коды преподаватель впаяет kerzh, пару
Мне лично все равно, что ему там поставят. И по этой же причине я не собираюсь делать что-либо через одно место, особенно, если я это буду осознавать.
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
как должно быть всё в идеале
Так не бывает.
0
Автор FAQ
 Аватар для -=ЮрА=-
6612 / 4254 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
19.03.2012, 22:58 19

Не по теме:

Цитата Сообщение от fasked Посмотреть сообщение
Мне лично все равно, что ему там поставят.
- странно думаю мы в ответе за тех кому написали, притом у тебя должность немного обязывает...

Цитата Сообщение от fasked Посмотреть сообщение
Да без базара, я сейчас сразу инверт напишу в одной функции на асме и будет строк 5-6 кода
Зачем?
- затем, что бысрей и лаконичней асемблерной вставки ничего не будет, а так просто шоб було:)



Добавлено через 3 минуты

Не по теме:

Цитата Сообщение от fasked Посмотреть сообщение
Я не вел речи о понятности или сдвигах.
- ну а я вёл о понятности алгоритма именно для автору темы вот и всё. Мне вообще по душе писать оконные MFC приложения а не чёрные досовские окна, но для лучшего понимания авторам тем пишу в консоли8-)

0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12837 / 7573 / 1765
Регистрация: 25.07.2009
Сообщений: 13,970
19.03.2012, 23:31 20
Лучший ответ Сообщение было отмечено как решение

Решение

А прерву-ка я эту милую беседу, пока до обсуждения распада образовательной системы на постсоветском пространстве не добрались. Примеров предоставили достаточное количество. Если понадобятся какие-то разъяснения, ТС, пишите - открою тему.

Добавлено через 24 минуты
В виде бонуса
C
1
2
3
4
5
6
7
8
9
10
11
/* Тупой вариант функции инвертирования битов. Чтобы концепцию не портить, никаких проверок допустимости параметров,
всё на совести вызывающей стороны */
unsigned long invert(unsigned long x, size_t count, size_t pos){
    size_t i;
    
    /* Незатейливо в цикле инвертируем биты. УжОс, никогда так не делайте! */
    for ( i = pos; i < pos + count; ++i )
        x ^= 1 << i;
    
    return x;
}
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.03.2012, 23:31
Помогаю со студенческими работами здесь

Поделить строку на блоки по 12 бит и заменить в каждом блоке случайный бит
На входе есть строка типа string, каждый символ нужно перевести в последовательность битов, и эту последовательность разделить на блоки по...

Сделать в числе n циклическую перестановку четных бит на k бит вправо
Написать программу, которая позволит ввести два числа n и k типа ulong с клавиатуры, напечатать их на дисплее, и используя битовые операции...

Подскажите какую аппаратную платформу с моим железом ставить? 64-бит или 86-бит !
Народ всем здравствуйте!!! Вчера обновил железо на своей машине! Проц. AMD Athlon II X4 631 для Socket FM1 Мать Gigabyte GA-A55M-S2V ...

Студент определяет свой номер N в списке группы. Старосте группы сообщается идентификатор M группы
:cry::cry::cry: Решить задание нужно до 25.11.2018. SOS!!!!!

Преобразовать прямоугольную матрицу так, чтобы ее ряды расположились на увеличение их бит-в-бит сумм
Доброго времени суток! Прошу помочь с решением простых задач 2.Реформировать прямоугольную матрицу так, чтобы ее ряды...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Закрытая тема Создать тему
Опции темы

Новые блоги и статьи
Java Micronaut в Docker: контейнеризация с Maven и Jib
Javaican 16.03.2025
Когда речь заходит о микросервисной архитектуре на Java, фреймворк Micronaut выделяется среди конкурентов. Он создан с учётом особенностей облачных сред и контейнеров, что делает его идеальным. . .
Управление зависимостями в Java: Сравнение Spring, Guice и Dagger 2
Javaican 16.03.2025
Инъекция зависимостей (Dependency Injection, DI) — один из фундаментальных паттернов проектирования, который радикально меняет подход к созданию гибких и тестируемых Java-приложений. Суть этого. . .
Apache Airflow для оркестрации и автоматизации рабочих процессов
Mr. Docker 16.03.2025
Управление сложными рабочими процессами — одна из главных головных болей инженеров данных и DevOps-специалистов. Представьте себе: каждый день нужно запускать десятки скриптов в определенной. . .
Оптимизация приложений Java для ARM
Javaican 16.03.2025
ARM-архитектура переживает настоящий бум популярности в технологическом мире. Когда-то воспринимаемая исключительно как решение для мобильных устройств и встраиваемых систем, сегодня она штурмует. . .
Управление состоянием в Vue 3 с Pinia и Composition API
Reangularity 16.03.2025
Когда я начал работать с Vue несколько лет назад, мне казалось достаточным использовать простую передачу данных через props и события между компонентами. Однако уже на среднем по сложности проекте. . .
Введение в DevSecOps: основные принципы и инструменты
Mr. Docker 16.03.2025
DevSecOps - это подход к разработке программного обеспечения, который объединяет в себе принципы разработки (Dev), безопасности (Sec) и эксплуатации (Ops). Суть подхода заключается в том, чтобы. . .
GitHub Actions vs Jenkins: Сравнение инструментов CI/CD
Mr. Docker 16.03.2025
В этой битве за эффективность и скорость выпуска программных продуктов ключевую роль играют специализированные инструменты. Два гиганта в этой области — GitHub Actions и Jenkins — предлагают разные. . .
Реактивное программировани­е с Kafka Stream и Spring WebFlux
Javaican 16.03.2025
Реактивное программирование – это программная парадигма, ориентированная на потоки данных и распространение изменений. Она позволяет выражать статические или динамические потоки данных и. . .
Простая нейросеть на КуМир: Учебное пособие по созданию и обучению нейронных сетей
EggHead 16.03.2025
Искусственные нейронные сети — удивительная технология, позволяющая компьютерам имитировать работу человеческого мозга. Если вы хотя бы немного интересуетесь современными технологиями, то наверняка. . .
Исполнитель Кузнечик в КуМир: Решение задач
EggHead 16.03.2025
Среди множества исполнителей в системе КуМир особое место занимает Кузнечик — простой, но невероятно полезный виртуальный персонаж, который перемещается по числовой прямой, выполняя ваши команды. На. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru