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

Битовые операции, n-ый бит - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.94
cybergirl
0 / 0 / 0
Регистрация: 28.11.2011
Сообщений: 7
06.12.2011, 11:33     Битовые операции, n-ый бит #1
Подскажите, пожалуйста!
Дано число x. Как установить на место n-ого бита единицу?

Вот, что скомпоновала из найденного.. но тут неправильный результат. Вместо 7 из числа 5 получается число 2.
C++
1
2
3
4
5
6
7
8
nt main ()
{
int x = 5;
int n =1;
const bool i = 1;
x>>=1;
x = ( x & ~ (1<<n) ) | (i << n);
}
Я еще несколько вопросов:
1) чем отличается x>>1 от x>>=1 ?
2) как вывести или обозначить битовую единицу? const bool i = 1 -так правильно?
3) что конкретно получается в операции "НЕ сдвиг"? вот так "~ (1<<n)" ?
4) есть ли простой вариант вычленить n-ый бит и проводить с ним дальнейшие действия?
5) как вывести битовое значение целиком? переводить десятичное в двоичную или есть короткий вариант?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2011, 11:33     Битовые операции, n-ый бит
Посмотрите здесь:

Битовые операции C++
C++ Битовые операции
Битовые операции, битовые поля. C++
C++ Битовые операции - перемещение бит для unsigned int
Битовые операции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
06.12.2011, 11:41     Битовые операции, n-ый бит #2
Цитата Сообщение от cybergirl Посмотреть сообщение
Подскажите, пожалуйста!
Дано число x. Как установить на место n-ого бита единицу?
x = x | (1 << n);
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
06.12.2011, 11:43     Битовые операции, n-ый бит #3
Цитата Сообщение от cybergirl Посмотреть сообщение
Как установить на место n-ого бита единицу?
С помощью битового ИЛИ.
C
1
x |= (1 << n)
, где x - исходное число, n - номер бита, при чем 0 для первого.
Цитата Сообщение от cybergirl Посмотреть сообщение
чем отличается x>>1 от x>>=1 ?
Запись x >>= 1 будет аналогична записи x = x >> 1.
Цитата Сообщение от cybergirl Посмотреть сообщение
как вывести или обозначить битовую единицу? const bool i = 1 -так правильно?
Неправильно. Битовая единица ничем не отличается от обычной единицы. Конкретный бит получается операцией возведения 2 в степень n. Или соответствующим смещением:
1 << 0 - первый бит (0001b)
1 << 1 - второй бит (0010b)
1 << 2 - третий бит (0100b)
1 << 3 - четвертый бит (1000b)
Цитата Сообщение от cybergirl Посмотреть сообщение
есть ли простой вариант вычленить n-ый бит и проводить с ним дальнейшие действия?
Это возможно с помощью битового И. По той же схеме:
C
1
b = x & (1 << n)
, в результате в переменной b окажется число, в котором только n-ый бит единичный.
Цитата Сообщение от cybergirl Посмотреть сообщение
как вывести битовое значение целиком? переводить десятичное в двоичную или есть короткий вариант?
Переводить.
cybergirl
0 / 0 / 0
Регистрация: 28.11.2011
Сообщений: 7
06.12.2011, 12:03  [ТС]     Битовые операции, n-ый бит #4
Спасибо большое за ответы!

Цитата Сообщение от fasked Посмотреть сообщение
Это возможно с помощью битового И. По той же схеме:
C
1
b = x & (1 << n)
, в результате в переменной b окажется число, в котором только n-ый бит единичный.
а если нужно не единицу записать, а именно узнать какой там бит? Например, узнать 0 или 1 стоит в 3ем бите? сравнить, одинаковые ли значения в 3-ем и 4-ом бите (две единицыили два нуля)?
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
06.12.2011, 12:18     Битовые операции, n-ый бит #5
Цитата Сообщение от cybergirl Посмотреть сообщение
а если нужно не единицу записать
Так никто и не записывает.
Цитата Сообщение от cybergirl Посмотреть сообщение
Например, узнать 0 или 1 стоит в 3ем бите? сравнить, одинаковые ли значения в 3-ем и 4-ом бите (две единицыили два нуля)?
Привести это выражение к типу bool. Или выполнить битовый сдвиг вправо. Или просто сравнить с нулем.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
inline bool isset(unsigned x, unsigned n) {
     return (x & (1 << n)) != 0;
}
 
int main() {
     unsigned int x = 0x9;
     if (isset(x, 0) == isset(x, 3)) {
          // первый и четвертый биты равны
     }
 
     if (isset(x, 0)) {
          // первый бит - единичный
     }
 
     if (!isset(x, 1)) {
          // второй бит - нулевой
     }
 
     // etc
}
Цитата Сообщение от cybergirl Посмотреть сообщение
что конкретно получается в операции "НЕ сдвиг"? вот так "~ (1<<n)" ?
Это не "НЕ сдвиг". Это инверсия после сдвига. Все биты кроме n - единичные.
И снова по той же самой схеме:
~(1 << 0) = ..1110b
~(1 << 1) = ..1101b
~(1 << 2) = ..1011b
~(1 << 3) = ..0111b


Просто сдвиг дает результат: (1 << 0) = 0001b. Операция ~ изменяет значение каждого бита на противоположное.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.12.2011, 12:36     Битовые операции, n-ый бит #6
Цитата Сообщение от cybergirl Посмотреть сообщение
>>=
а такой оператор вообще есть?

Добавлено через 1 минуту
Цитата Сообщение от cybergirl Посмотреть сообщение
~ (1<<n)
Сначала сдвинуть, потом инвертировать биты результата.
fasked
06.12.2011, 12:37
  #7

Не по теме:

Цитата Сообщение от taras atavin Посмотреть сообщение
а такой оператор вообще есть?
А попробовать религия не позволила? По аналогии с
C
1
*= /= += -= |= &=
taras atavin, и вообще неплохо бы тему прочитать сначала, прежде чем писать одно и тоже.

Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
06.12.2011, 12:41     Битовые операции, n-ый бит #8
На всякий случай. Если взять у автора из исходника строку номер 7:

C
1
x = (x & ~ (1<<n)) | (i << n);
то получится код, который выставляет n'ый бит в значение i (i - динамическая величина, равная нулю или единице). При этом 6-ю строку со сдвигом надо выкинуть. Т.е. изначально задача по сути была решена правильно (по общей формуле записи битового поля произвольной длины), только 6-я строка была лишняя
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.12.2011, 12:57     Битовые операции, n-ый бит #9
Цитата Сообщение от cybergirl Посмотреть сообщение
>>=
а такой оператор вообще есть?

Добавлено через 1 минуту
Цитата Сообщение от cybergirl Посмотреть сообщение
~ (1<<n)
Сначала сдвинуть, потом инвертировать биты результата. Пусть sizeof (int) =2, тогда
1=0000000000000001b
1<<0=0000000000000001b=1
1<<1=0000000000000010b=2
1<<2=0000000000000100b=4
1<<3=0000000000001000b=8
1<<4=0000000000010000b=16
1<<5=0000000000100000b=32
1<<6=0000000001000000b=64
1<<7=0000000010000000b=128
1<<8=0000000100000000b=256
1<<9=0000001000000000b=512
1<<10=0000010000000000b=1024
1<<11=0000100000000000b=2048
1<<12=0001000000000000b=4096
1<<13=0010000000000000b=8192
1<<14=0100000000000000b=16384
1<<15=1000000000000000b=32768
1<<16=0000000000000000b=0
~1=~0000000000000001b=1111111111111110b=65534
~(1<<0)=~0000000000000001b=1111111111111110b=65534
~(1<<1)=~0000000000000010b=1111111111111101b=65533
~(1<<2)=~0000000000000100b=1111111111111011b=65531
~(1<<3)=~0000000000001000b=1111111111110111b=65527
~(1<<4)=~0000000000010000b=1111111111101111b=65519
~(1<<5)=~0000000000100000b=1111111111011111b=65503
~(1<<6)=~0000000001000000b=1111111110111111b=65471
~(1<<7)=~0000000010000000b=1111111101111111b=65407
~(1<<8)=~0000000100000000b=1111111011111111b=65279
~(1<<9)=~0000001000000000b=1111110111111111b=65023
~(1<<10)=~0000010000000000b=1111101111111111b=64511
~(1<<11)=~0000100000000000b=1111011111111111b=63487
~(1<<12)=~0001000000000000b=1110111111111111b=61439
~(1<<13)=~0010000000000000b=1101111111111111b=57343
~(1<<14)=~0100000000000000b=1011111111111111b=49151
~(1<<15)=~1000000000000000b=0111111111111111b=32767
~(1<<16)=~0000000000000000b=1111111111111111b=65535
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
06.12.2011, 12:59     Битовые операции, n-ый бит #10
Цитата Сообщение от taras atavin Посмотреть сообщение
1<<16
Если sizeof(int) == 2, то эта запись бессмысленна совершенно.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.12.2011, 13:06     Битовые операции, n-ый бит #11
Цитата Сообщение от cybergirl Посмотреть сообщение
5) как вывести битовое значение целиком? переводить десятичное в двоичную или есть короткий вариант?
А где ты возьмёшь десятичное? Получается: перевести из двоичного в десятичное, чтоб перевести снова в двоичное. Могу предложить кривоварианты: переводом внутреннего неявно двочного в явно двоичное остатками и
C++
1
2
3
4
5
char d[2]={'0','1'};
for (i=sizeof(x)-1; i>=0; --i)
{
 std::cout<<d[(x>>i)&1];
}
cybergirl
0 / 0 / 0
Регистрация: 28.11.2011
Сообщений: 7
06.12.2011, 14:31  [ТС]     Битовые операции, n-ый бит #12
Цитата Сообщение от taras atavin Посмотреть сообщение
А где ты возьмёшь десятичное?
если в примере просто cout>>x то выводится десятичное
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2011, 17:58     Битовые операции, n-ый бит
Еще ссылки по теме:

Битовые операции и операции смещения языка С C++
C++ Битовые операции
C++ Битовые операции

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

Или воспользуйтесь поиском по форуму:
cybergirl
0 / 0 / 0
Регистрация: 28.11.2011
Сообщений: 7
15.12.2011, 17:58  [ТС]     Битовые операции, n-ый бит #13
Ребят, подскажите, пожалуйста!
Считываю файл в "((file>>c) && (simb<20)" в переменную unsignd char c, смотрю код символа, перевожу код в двоичную систему и записываю в массив. Получается массив бит. НО, если один из символов в файле был "перенос" или "разрыв страницы", считываются лишь предшествующие ему символы. А как сделать, чтобы считывались все символы, независимо от того, какое они несут значение?
Yandex
Объявления
15.12.2011, 17:58     Битовые операции, n-ый бит
Ответ Создать тему
Опции темы

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