Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/16: Рейтинг темы: голосов - 16, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 21.10.2014
Сообщений: 7
1

Функция, инвертирующая в целом числе n разрядов, начиная с позиции p

21.10.2014, 21:39. Показов 3125. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пожалуйста помогите. Надо написать функцию , которая возвращает число , полученное из целого числа x , в котором инвертированы n разрядов , начиная с позиции p , а остальные разряды оставлены без изменений. Проверять правильность значений n и p .
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.10.2014, 21:39
Ответы с готовыми решениями:

Установить в целом числе биты в ноль, начиная с определенной позиции
Доброго времени суток. Помогите пожалуйста с заданием: Заранее благодарен за помощь.

В длинном целом числе n поменять пары двоичных разрядов в зеркальном порядке
всем снова привет. есть задача: "в длинном целом числе N поменять пары двоичных разрядов в...

Заменить в числе a v битов, начиная с n-й позиции
Добрый вечер, уважаемые форумчане, подскажите пожалуйста решение сей задачи Заменить в числе a v...

Написать функцию, которая возвращает число, полученное из целого числа x, в котором единицы установлены в n разрядов, начиная с позиции p (крайний пра
Написать функцию, которая возвращает число, полученное из целого числа x, в котором единицы...

12
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
21.10.2014, 21:59 2
Как-то так:
C++
1
2
3
4
5
6
7
8
int f(int x, int n, int p)
{
    int y = 1 << p;
    for(int i = p; i < p + n; i++)
        if(x & y) x &= ~y;
        else x |= y;
    return x;
}
0
0 / 0 / 0
Регистрация: 21.10.2014
Сообщений: 7
21.10.2014, 22:11  [ТС] 3
Спасибо, но можешь немного объяснить код...
0
3 / 3 / 0
Регистрация: 20.01.2014
Сообщений: 69
21.10.2014, 22:13 4
Цитата Сообщение от nmcf Посмотреть сообщение
Как-то так
Для f(777,4,4) возвращает 777, должно возвращать 1017. Попробуйте сами в калькуляторе - программист инвертировать 4 бита начиная с 4го.

Цитата Сообщение от Leeeroy Посмотреть сообщение
число , полученное из целого числа x , в котором инвертированы n разрядов , начиная с позиции p , а остальные разряды оставлены без изменений
Вот попробуйте(если n разрядов начиная с позиции p выходят за границу функция возвращает 0):
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
int invert(int x, int n, int p) {
    if(n+p>32)
        return 0;
    for(int i=p; i<p+n; i++)
        x = ((x >> i) & 1) ? x - (1 << i) : x + (1 << i);
    return x;
}
 
int main () {
    std::cout << invert(777,4,4) << std::endl;
    return 0;
}
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
21.10.2014, 22:14 5
Что объяснять? Побитовая обработка начиная с позиции p. Нумерация с нуля.
0
0 / 0 / 0
Регистрация: 21.10.2014
Сообщений: 7
21.10.2014, 22:19  [ТС] 6
Просто недавно начал учиться на С++, и не могу понять что да как мне сделать в этом задании
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
21.10.2014, 22:26 7
BlackUser прав, сдвиг забыл. Вот так правильно:
C++
1
2
3
4
5
6
7
8
9
10
11
int f(int x, int n, int p)
{
    int y = 1 << p;
    for(int i = p; i < p + n; i++)
    {
        if(x & y) x &= ~y;
        else x |= y;
        y <<= 1;
    }
    return x;
}
Добавлено через 1 минуту
Просто берётся единица в разряде p, выделяется соответствующий бит и либо сбрасывается, либо устанавливается.
y - маска для бита.
0
0 / 0 / 0
Регистрация: 21.10.2014
Сообщений: 7
21.10.2014, 22:34  [ТС] 8
Цитата Сообщение от nmcf Посмотреть сообщение
Просто берётся единица в разряде p, выделяется соответствующий бит и либо сбрасывается, либо устанавливается.
y - маска для бита.
а что такое маска бита?
Если не трудно, можешь написать полный код, типа с вводом х, n и p,а то туплю очень.
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
21.10.2014, 22:46 9
Ну например надо выделить 3-й бит из байта. Маска будет 00001000. Т. е. все нули, а третий бит - 1.

Добавлено через 7 минут
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
#include "stdafx.h"
 
#include <iostream>
#include <bitset>
 
int f(int x, int n, int p)
{
    int y = 1 << p;
    for(int i = p; i < p + n; i++)
    {
        if(x & y) x &= ~y;
        else x |= y;
        y <<= 1;
    }
    return x;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    int x = 777;
    int r = f(x, 4, 4);
    std::cout << "x=" << std::bitset<32>(x) << std::endl << "result=" << std::bitset<32>(r) << std::endl;
 
    system("pause");
    return 0;
}
0
0 / 0 / 0
Регистрация: 21.10.2014
Сообщений: 7
21.10.2014, 22:50  [ТС] 10
Цитата Сообщение от nmcf Посмотреть сообщение
#include "stdafx.h"
Что это за библиотека?
Цитата Сообщение от nmcf Посмотреть сообщение
int _tmain(int argc, _TCHAR* argv[])
Пишет что идентификатор _TCHAR не определен
0
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1724
Регистрация: 18.10.2014
Сообщений: 16,066
22.10.2014, 03:08 11
Цитата Сообщение от Leeeroy Посмотреть сообщение
Пожалуйста помогите. Надо написать функцию , которая возвращает число , полученное из целого числа x , в котором инвертированы n разрядов , начиная с позиции p , а остальные разряды оставлены без изменений. Проверять правильность значений n и p .
Странно, что автор уже приведенного кода не воспользовался готовой операцией битовой инверсии '^' и вместо этого взялся выписывать ее вручную через другие битовые операции.

На самом деле расписывать циклы совершенно не обязательно.

C++
1
2
3
4
5
6
unsigned invert_np(unsigned x, unsigned p, unsigned n)
{
  unsigned mask = (1u << n) - 1; // Маска, содержащая n единиц с позиции 0
  mask <<= p;                    // Маска, содержащая n единиц с позиции p
  return x ^ mask;               // Инвертируем биты по маске
}
Все. Т.е. при желании можно написать в одну строчку 'return x ^ (((1u << n) - 1) << p);'

Осталось только добавить проверку правильности параметров...
1
_Ivana
22.10.2014, 05:12
  #12

Не по теме:

Не думал, что буду ставить вам +,TheCalligrapher - не всегда ваша критика по делу, но в данном случае это именно оно - и кто-то должен был сказать, что инвертировать биты надо ксором, а не сомнительными другими алгоритмами.

0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
22.10.2014, 08:04 13
Сомнительными алгоритмами? А по существу есть возражения? Задача решена.

#include "stdafx.h", _tmain - это проект для VS, можно убрать, сделать простой main().
0
22.10.2014, 08:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.10.2014, 08:04
Помогаю со студенческими работами здесь

Функция вставляющая подстроку начиная с заданной позиции
Помогите мне, please с решением - этой не легкой задачи !!! Рассматривая строку как массив...

Проверить, как изменилось количество разрядов в числе M по сравнению с количеством разрядов числа N
Выручайте....Дано натуральное число N. Определить M=N!. Проверить, как изменилось количество...

Проверить как изменится количество разрядов в числе M по сравнению с количеством разрядов числа N
Дано натуральное число N. Определить M=N! Проверить как измениться количевство разрядов в числе M...

Функция, удаляет из строки заданное количество символов, начиная с заданной позиции
Нужно составить функцию, которая удаляет из строки заданное количество символов, начиная с заданной...

Функция Delete(s,n,l) Назначение: удаление из строки s подстроки, начиная с позиции n, длиной l
помогите задачку написать.

Функция удаляет из строки заданное количество символов, начиная с заданной позиции
Подскажите, что не так в программе.? Функция удаляет из строки заданное количество символов,...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru