Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.89
Buckstabue
177 / 126 / 24
Регистрация: 12.01.2012
Сообщений: 624
#1

Как инвертировать первый бит у int? - C++

22.10.2012, 17:54. Просмотров 5411. Ответов 27
Метки нет (Все метки)

Что-то я совсем плохо соображаю. Напомните, пожалуйста, как инвертировать первый бит у int? Что бы если б там был ноль, то стал 1 и наоборот. При этом остальные биты чтоб не затрагивал. Система может быть как 16, так 32, так и 64 битной
http://www.cyberforum.ru/cpp-beginners/thread1288161.html
Прила в голову идея, что первый бит отвечает за четность числа... Но хотелось бы оформить это покрасивее что ли
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.10.2012, 17:54
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как инвертировать первый бит у int? (C++):

Первый бит числа
Пишу программу для сжатия файлов по алгоритму RLE. Чтобы программа понимала,...

Битовые операции - перемещение бит для unsigned int
Помогите разобраться, задание: Создайте функцию, которая перемещает биты...

Удалить из каждого байта строки первый (старший) бит.
Здравствуйте. Суть задачи в общем-то и отображена в названии задачи. Есть...

Биты (поменять нулевой и первый бит, второй и третий и т.д.)
Нужно поменять нулевой и первый бит, второй и третий и т.д. Тип числа -...

Закодировать файл. Взять 7 байт. Первый бит каждого байта переместить в 8 байт
Нужно открыть бинарный файл и закодировать следующим образом. Взять 7 байт....

27
defer
秘密
558 / 238 / 16
Регистрация: 29.11.2010
Сообщений: 797
22.10.2012, 18:02 #2
вот например

C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
using namespace std;
 
int main()
{
   int x=4;
   x = x | (1 << 0);
   cout<<x;
   
}
0
Buckstabue
177 / 126 / 24
Регистрация: 12.01.2012
Сообщений: 624
22.10.2012, 18:04  [ТС] #3
defer, а если там будет 1, то ничего страшного не произойдет??
0
Герц
524 / 341 / 12
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
22.10.2012, 18:05 #4
Как-нибудь так
C++
1
a ^= 1;
1
defer
秘密
558 / 238 / 16
Регистрация: 29.11.2010
Сообщений: 797
22.10.2012, 18:07 #5
Цитата Сообщение от Buckstabue Посмотреть сообщение
а если там будет 1, то ничего страшного не произойдет??
Просто изменится второй бит, результат будет не 5, а 6
Насколько это страшно, не знаю
0
Buckstabue
177 / 126 / 24
Регистрация: 12.01.2012
Сообщений: 624
22.10.2012, 18:10  [ТС] #6
Герц, огромнейшее спасибо. Очень похоже на то что мне как раз и нужно! Сам бы три часа такого рода задачу бы решал. К утру надо программу сдать, а мозги уже не парят. Спасибо еще раз!
0
Герц
524 / 341 / 12
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
22.10.2012, 18:11 #7
Обнови страницу, я там упростил)
0
Buckstabue
177 / 126 / 24
Регистрация: 12.01.2012
Сообщений: 624
22.10.2012, 18:20  [ТС] #8
Герц, по-моему сдвиг единички на нуль позиций влево более нагляден был.
0
Thinker
Эксперт С++
4232 / 2206 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
22.10.2012, 18:22 #9
Цитата Сообщение от Buckstabue Посмотреть сообщение
сдвиг единички на нуль позиций влево более нагляден был.
этот вариант неверный, так как в этом случае 1 устанавливается в младшем разряде, а не инвертируется, если вы про пост 2. естественно, вариант
a ^= 1
самый интересный, то есть обычное сложение в кольце вычетов по модулю два
0
Buckstabue
177 / 126 / 24
Регистрация: 12.01.2012
Сообщений: 624
22.10.2012, 18:25  [ТС] #10
Thinker, я имел в виду a ^= 1 << 0;
0
Thinker
Эксперт С++
4232 / 2206 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
22.10.2012, 18:27 #11
Цитата Сообщение от Buckstabue Посмотреть сообщение
Thinker, я имел в виду a ^= 1 << 0;
понятно. тогда можно обобщить для инвертирования i-го (справа налево) бита))
a ^= 1 << i;
1
Kgfq
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
22.10.2012, 18:57 #12
Thinker, тогда инвертируются все биты позади него
0
Thinker
Эксперт С++
4232 / 2206 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
22.10.2012, 19:00 #13
Цитата Сообщение от Kgfq Посмотреть сообщение
Thinker, тогда инвертируются все биты позади него
Вы уверены? инвертируется только i-ый бит))
это очевидно из определения операции ^
1
Kgfq
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
22.10.2012, 19:05 #14
Thinker, операция ^ инвертирует все биты в числе. А 1 << 2 уже 100. И вот на месте нулей инвертирование тоже будет
0
Buckstabue
177 / 126 / 24
Регистрация: 12.01.2012
Сообщений: 624
22.10.2012, 19:08  [ТС] #15
Kgfq, у меня, вроде, работает все как и следует.
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
int main(void)
{
   int x = 7;
   x ^= 1 << 2;
 
   std::cout << x << std::endl;
 
   return 0;
}
Инвертируется только тот бит который я задал

Не по теме:

Эх, такое ощущение что лет 100 на Си++ не писал =) Даже заголовки забыл как называются

0
Kgfq
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
22.10.2012, 19:31 #16
Buckstabue, это потому, что:

7: 111
1 << 2: 100

1 ^ 1 = 0
1 ^ 0 = 1
а вот есть 8 введете, то удивитесь

Добавлено через 11 минут
C++
1
2
3
4
5
6
7
8
9
10
11
template <typename Type> Type Invert(Type val, int n)
{
    unsigned char *ptr = (unsigned char*)&val;
    if((ptr[n/8] >> n%8) == 1)
    {
        ptr[n/8] -= 1 << n%8;
    } else {
        ptr[n/8] += 1 << n%8;
    }
    return val;
}
Добавлено через 1 минуту
PS: биты начинают отсчет с 0.
0
Thinker
Эксперт С++
4232 / 2206 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
22.10.2012, 19:38 #17
Kgfq, может хватит уже сказки рассказывать
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
void Display(int a, int n)
{
   int i;
   for (i = n - 1; i >= 0; i--)
      printf("%d ", (a >> i) & 1);
   printf("\n");
}
 
int main( )
{
   int a = 8;
   Display(a, sizeof(int)*8);
   a ^= 1 << 2;
   Display(a, sizeof(int)*8);
   return 0;
}
0
Toshkarik
1148 / 865 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
22.10.2012, 19:40 #18
Kgfq, Вы о чем? Все верно: 1111 ^ 100 = 1011

Добавлено через 1 минуту
Kgfq, Вы, наверное, путаете операцию исключающее ИЛИ и инвертирования битов ( ~ ).
0
Kgfq
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
22.10.2012, 19:45 #19
Toshkarik, откуда 1111?
7 = 1*22 + 1*21 + 1*20
следовательно 710 == 1112

111 ^ 100 = 011
Введите 8 и убедитесь.

Добавлено через 1 минуту
Toshkarik, Нет, не путаю. ^ - исключающее или.

a b F
0 0 0
1 0 1
0 1 1
1 1 0
0
Thinker
Эксперт С++
4232 / 2206 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
22.10.2012, 19:49 #20
Цитата Сообщение от Kgfq Посмотреть сообщение
7 = 1*24 + 12 + 1*22
http://www.cyberforum.ru/cgi-bin/latex.cgi?7 = 1*2^2+1*2+1*2^0
0
22.10.2012, 19:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.10.2012, 19:49
Привет! Вот еще темы с решениями:

Как понять int a(int x,int y, int z)?
какое значение будет у переменной а?

Error LNK2019: unresolved external symbol "public: __thiscall Vector<int>::Vector<int>(int,int,int)" (?0?$Vec
Вот есть заголовочный файл // Заголовочный файл Vector.h #ifndef VECTOR_H...

Как считать данные в vector<pair<int, pair<int, int>>> arr(m) ?
Здравствуйте! Помогите, как считать данные данные в массив такого типа?...

Как заполнить один int пустой массив другим int массивом ?
Можно пример кода :)


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

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

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