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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.89
Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
#1

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

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

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

52 бит не влазит в long int - C++
вот код: struct DOUBLE{ long int S : 1; long int E : 11; long int M : 52; DOUBLE(){ *(double*)this = 0; } ...

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

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

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

Удалить из каждого байта строки первый (старший) бит. - C++
Здравствуйте. Суть задачи в общем-то и отображена в названии задачи. Есть строка: unsigned char str; Необходимо в каждом...

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

27
Kgfq
74 / 37 / 2
Регистрация: 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
Эксперт С++
4226 / 2200 / 150
Регистрация: 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
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
22.10.2012, 19:40 #18
Kgfq, Вы о чем? Все верно: 1111 ^ 100 = 1011

Добавлено через 1 минуту
Kgfq, Вы, наверное, путаете операцию исключающее ИЛИ и инвертирования битов ( ~ ).
0
Kgfq
74 / 37 / 2
Регистрация: 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
Эксперт С++
4226 / 2200 / 150
Регистрация: 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
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
22.10.2012, 19:50 #21
Thinker, очепятался с этими тэгами, знаю. Уже поправить успел.
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
22.10.2012, 19:54 #22
Вы сами себе противоречите. Инвертируется только один бит, на i позиции. Какие еще 0 будут инвертированы? По Вашему 0^0 = 1?
0
Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
22.10.2012, 19:54  [ТС] #23
Kgfq, побитовое исключающее или. С восьмеркой все то же самое:
исходное число = 8(1000) после инвертирования третьего бита (x ^= 1 << 2) получается 12 или 1100. Что здесь непонятного?
0
Thinker
22.10.2012, 19:55
  #24

Не по теме:

Kgfq, судя по вашим постам, вроде человек с головой, вы чего так путаете с операцией ^? вроде определение знаете, не понятно почему вас так заклинило. вздохните поглубже и теоретически докажите утверждение, что инвертироваться только один бит будет

0
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
22.10.2012, 19:57 #25
Thinker,

int a, b, c;
c = a ^ b;

Разве a ^ b не проделает операцию исключающего или над всеми битами чисел а и b?
0
Thinker
Эксперт С++
4226 / 2200 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
22.10.2012, 19:59 #26
Цитата Сообщение от Kgfq Посмотреть сообщение
int a, b, c;
c = a ^ b;
Разве a ^ b не проделает операцию исключающего или над всеми битами чисел а и b?
да, все биты. только ничего, что в числе 1 << i все биты, кроме i-го, равны 0?
при этом
x ^ 0 = x
о чем это вам говорит. о том, что все биты, кроме i-го, останутся прежними
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
22.10.2012, 20:00 #27
Kgfq, сделает операцию, и инвертирует значение совершенно разные вещи. В записи 1 << i будет только одна единица в битовом представлении.
0
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
22.10.2012, 20:07 #28
Thinker, кхм, меня заело на: 0^0 = 1...

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

Не по теме:

Не сразу дошло, вообщем, что если у одного числа 0, то у другого останется то, что есть.

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.10.2012, 20:07
Привет! Вот еще темы с ответами:

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

Error LNK2019: unresolved external symbol "public: __thiscall Vector<int>::Vector<int>(int,int,int)" (?0?$Vec - C++
Вот есть заголовочный файл // Заголовочный файл Vector.h #ifndef VECTOR_H #define VECTOR_H #include &lt;iostream&gt; using...

Как считать данные в vector<pair<int, pair<int, int>>> arr(m) ? - C++
Здравствуйте! Помогите, как считать данные данные в массив такого типа? vector&lt;pair&lt;int, pair&lt;int, int&gt;&gt;&gt; arr(m) Пытался вот так...

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


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

Или воспользуйтесь поиском по форуму:
28
Yandex
Объявления
22.10.2012, 20:07
Ответ Создать тему
Опции темы

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