Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.89
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
22.10.2012, 17:54     Как инвертировать первый бит у int? #1
Что-то я совсем плохо соображаю. Напомните, пожалуйста, как инвертировать первый бит у int? Что бы если б там был ноль, то стал 1 и наоборот. При этом остальные биты чтоб не затрагивал. Система может быть как 16, так 32, так и 64 битной
Прила в голову идея, что первый бит отвечает за четность числа... Но хотелось бы оформить это покрасивее что ли
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
defer
秘密
 Аватар для defer
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
22.10.2012, 18:02     Как инвертировать первый бит у int? #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;
   
}
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
22.10.2012, 18:04  [ТС]     Как инвертировать первый бит у int? #3
defer, а если там будет 1, то ничего страшного не произойдет??
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
22.10.2012, 18:05     Как инвертировать первый бит у int? #4
Как-нибудь так
C++
1
a ^= 1;
defer
秘密
 Аватар для defer
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
22.10.2012, 18:07     Как инвертировать первый бит у int? #5
Цитата Сообщение от Buckstabue Посмотреть сообщение
а если там будет 1, то ничего страшного не произойдет??
Просто изменится второй бит, результат будет не 5, а 6
Насколько это страшно, не знаю
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
22.10.2012, 18:10  [ТС]     Как инвертировать первый бит у int? #6
Герц, огромнейшее спасибо. Очень похоже на то что мне как раз и нужно! Сам бы три часа такого рода задачу бы решал. К утру надо программу сдать, а мозги уже не парят. Спасибо еще раз!
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
22.10.2012, 18:11     Как инвертировать первый бит у int? #7
Обнови страницу, я там упростил)
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
22.10.2012, 18:20  [ТС]     Как инвертировать первый бит у int? #8
Герц, по-моему сдвиг единички на нуль позиций влево более нагляден был.
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
22.10.2012, 18:22     Как инвертировать первый бит у int? #9
Цитата Сообщение от Buckstabue Посмотреть сообщение
сдвиг единички на нуль позиций влево более нагляден был.
этот вариант неверный, так как в этом случае 1 устанавливается в младшем разряде, а не инвертируется, если вы про пост 2. естественно, вариант
a ^= 1
самый интересный, то есть обычное сложение в кольце вычетов по модулю два
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
22.10.2012, 18:25  [ТС]     Как инвертировать первый бит у int? #10
Thinker, я имел в виду a ^= 1 << 0;
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
22.10.2012, 18:27     Как инвертировать первый бит у int? #11
Цитата Сообщение от Buckstabue Посмотреть сообщение
Thinker, я имел в виду a ^= 1 << 0;
понятно. тогда можно обобщить для инвертирования i-го (справа налево) бита))
a ^= 1 << i;
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
22.10.2012, 18:57     Как инвертировать первый бит у int? #12
Thinker, тогда инвертируются все биты позади него
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
22.10.2012, 19:00     Как инвертировать первый бит у int? #13
Цитата Сообщение от Kgfq Посмотреть сообщение
Thinker, тогда инвертируются все биты позади него
Вы уверены? инвертируется только i-ый бит))
это очевидно из определения операции ^
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
22.10.2012, 19:05     Как инвертировать первый бит у int? #14
Thinker, операция ^ инвертирует все биты в числе. А 1 << 2 уже 100. И вот на месте нулей инвертирование тоже будет
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
22.10.2012, 19:08  [ТС]     Как инвертировать первый бит у int? #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 на Си++ не писал =) Даже заголовки забыл как называются

Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
22.10.2012, 19:31     Как инвертировать первый бит у int? #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.
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
22.10.2012, 19:38     Как инвертировать первый бит у int? #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;
}
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
22.10.2012, 19:40     Как инвертировать первый бит у int? #18
Kgfq, Вы о чем? Все верно: 1111 ^ 100 = 1011

Добавлено через 1 минуту
Kgfq, Вы, наверное, путаете операцию исключающее ИЛИ и инвертирования битов ( ~ ).
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
22.10.2012, 19:45     Как инвертировать первый бит у int? #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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.10.2012, 19:49     Как инвертировать первый бит у int?
Еще ссылки по теме:

C++ Закодировать файл. Взять 7 байт. Первый бит каждого байта переместить в 8 байт
C++ Error LNK2019: unresolved external symbol "public: __thiscall Vector<int>::Vector<int>(int,int,int)" (?0?$Vec
52 бит не влазит в long int C++

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

Или воспользуйтесь поиском по форуму:
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
22.10.2012, 19:49     Как инвертировать первый бит у int? #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
Yandex
Объявления
22.10.2012, 19:49     Как инвертировать первый бит у int?
Ответ Создать тему
Опции темы

Текущее время: 02:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru