Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 08.11.2018
Сообщений: 43
1

Операции с битами. Изменить значение указанного бита произвольного целого числа на противоположное...

25.04.2019, 14:26. Просмотров 4627. Ответов 9
Метки нет (Все метки)

Ребята, буду рад любой помощи. Советы, подсказки, отдельные части кода, ссылки на полезные ресурсы.

Мне необходимо написать программу, которая изменяет значение указанного бита произвольного целого числа на противоположное (1 на 0, 0 на 1). Программа должна предоставлять возможность вводить различные целые числа, номер бита n (биты нумеруются справа на левый) и выводить результат как в десятичном, так и в двоичном виде.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.04.2019, 14:26
Ответы с готовыми решениями:

Написать функцию, изменяющую значение n-го бита на противоположное
Написать функцию, изменяющую значение n-го бита на противоположное. Значение принять с клавиатуры и...

Из произвольного целого числа или длинного целого числа, вводимого с клавиатуры, путем изменения цифр 0 или 1
Произвольное длинное целое число разделить на четыре однобайтовых целых числа, каждому из которых...

Извлечь 3 бита целого числа A с позиции n и перенести в число B на позицию m
Доброго времени суток.Дана вот такая задача : извлечь 3 бита числа А, начиная с позиции n, и...

Факториал произвольного целого числа
Не могу посчитать факториал больше 20, с чем это может быть связанно? подскажите пожалуйста...

9
Нарушитель
4586 / 2482 / 560
Регистрация: 12.03.2015
Сообщений: 12,215
25.04.2019, 14:42 2
Ахтунг! Не отлаживал! Писал на заборе!
C++
1
2
3
4
5
6
7
// функция изменяет значение указанного бита произвольного целого числа 
// на противоположное
int invert_bit(const int x, const char bit)
{
  int mask = 1 << bit;
  return (x & mask) ? (x & ~mask) : (x | mask); // скобки - для читабельности
}
0
0 / 0 / 0
Регистрация: 08.11.2018
Сообщений: 43
25.04.2019, 14:54  [ТС] 3
Verevkin, спасибо за ответ. Не могли бы вы пройтись по строкам вашей функции с объяснениями?
0
Нарушитель
4586 / 2482 / 560
Регистрация: 12.03.2015
Сообщений: 12,215
25.04.2019, 15:00 4
Цитата Сообщение от Hellgrove Посмотреть сообщение
Не могли бы вы пройтись по строкам вашей функции с объяснениями?
АХАХАХА, так и знал!
-------
Чо не понятно? Спрашивай.
0
580 / 137 / 57
Регистрация: 20.08.2017
Сообщений: 244
25.04.2019, 15:34 5
Лучший ответ Сообщение было отмечено Hellgrove как решение

Решение

Для того, чтобы инвертировать n−ый бит числа можно использовать следующее выражение: A = A XOR (1 << N):

C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
#define BIT_TOGGLE(a, n) ((a) ^= 1UL << (n));
 
int main(void)
{
    unsigned char number = 8;
    printf("%u", number); // 8
 
    BIT_TOGGLE(number, 3);
    printf("%u", number); // 0
}
Добавлено через 12 минут
Чтобы понять, как это работает, разберем небольшой пример:

Пусть A = 0000 10002 (810), N = 3.

Тогда 1 << N = 0000 0001 << 3 = 0000 1000. Далее —

C
1
2
3
  0000 1000 XOR
  0000 1000
= 0000 0000
2
Нарушитель
4586 / 2482 / 560
Регистрация: 12.03.2015
Сообщений: 12,215
25.04.2019, 16:31 6
Цитата Сообщение от Eanmos Посмотреть сообщение
Для того, чтобы инвертировать n−ый бит числа можно использовать следующее выражение: A = A XOR (1 << N):
И то верно. чот я тормознул. бывает...
0
0 / 0 / 0
Регистрация: 08.11.2018
Сообщений: 43
25.04.2019, 18:30  [ТС] 7
Eanmos, что происходит в 3 строчке кода?

Добавлено через 12 минут
Eanmos, допустим, пользователь ввел число 23. В двоичном виде это 10111. Теперь пользователь хочет заменить последний бит. Как получить 10110?

Добавлено через 30 минут
Eanmos, разобрался сам. Мне осталось только понять, как любое введенное число в десятичном виде представить в двоичном.

Добавлено через 23 секунды
Verevkin, вы тоже можете помочь в этом.
0
580 / 137 / 57
Регистрация: 20.08.2017
Сообщений: 244
25.04.2019, 19:42 8
Можно вот так, например:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <limits.h>
 
static char *byte_to_binary(unsigned char number)
{
    static char binary[CHAR_BIT + 1];
    binary[0] = '\0';
 
    for (unsigned char t = 128, i = 0; t > 0; t >>= 1, i++)
        binary[i] = (number & t) ? '1' : '0';
 
    return binary;
}
 
int main(void)
{
    for (unsigned char i = 0; i < 255; i++)
        puts(byte_to_binary(i));
}
1
0 / 0 / 0
Регистрация: 08.11.2018
Сообщений: 43
25.04.2019, 19:57  [ТС] 9
Eanmos, я несколько минут назад доделал уже) Спасибо вам за помощь. Кстати, то, что было непонятным в вашем первом сообщении, стало понятнее после пары часов работы)
0
Нарушитель
4586 / 2482 / 560
Регистрация: 12.03.2015
Сообщений: 12,215
25.04.2019, 20:44 10
Цитата Сообщение от Hellgrove Посмотреть сообщение
Verevkin, вы тоже можете помочь в этом.
Я был занят. Но свою функцию отдам.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// перевод беззнакового целого х в двоичное представление,
// дополняя слева нулями до длины z.
// Память не выделяет, размер буфера не проверяет! НЕ ЛОХАНИТЕСЬ. :))
char* uint32_to_bin(char* buf, unsigned x, unsigned char z)
{
  unsigned len = 0, temp = x;
  do len++, temp >>= 1; while (temp);
  
  if (z > len) len = z;
  memset(buf, '0', len);
  buf[len] = 0;
  char* ptr = buf + len - 1;
  while (x) *ptr-- = 0x30 + (x & 1), x >>= 1;
  return buf;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.04.2019, 20:44

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Получение значение сдвигаемого бита при операции логического сдвига влево
int a = Convert.ToInt32(&quot;110100110000&quot;, 2); int reg =a&lt;&lt;1; ...

Определение суммы цифр произвольного целого числа
надо разработать подпрограмму для определения суммы цифр произвольного целого числа и с помощью...

Создать 2 переменные, одна из которых хранит 2 старших бита исходного числа, другая 2 младших бита этого числа
Дано число. Создать 2 переменные, одна из которых хранит 2 старших бита исходного числа, другая 2...

Определить количество нечётных цифр произвольного целого отрицательного числа
Определить количество нечётных цифр произвольного целого отрицательного числа.


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.