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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.94
cybergirl
0 / 0 / 0
Регистрация: 28.11.2011
Сообщений: 7
#1

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

06.12.2011, 11:33. Просмотров 5123. Ответов 12
Метки нет (Все метки)

Подскажите, пожалуйста!
Дано число 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-ый бит
Посмотрите здесь:

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

Битовые операции - C++
Установить в ноль каждый третий значащий бит целого числа А А = 150(например) Через _itoa_s.. Битовые операции не моё совсем :(...

Битовые операции - C++
Доброго времени суток! Помогите решить задачу на тему &quot;Битовые операции&quot;: Ввести четыре целых числа P, Q, N и M. Что больше P*(2^M)...

Битовые операции - C++
Вот такая вот лаба на С, уже как не думал ну не могу решить я ее. Прошу помочь, прикрепил полное задание с примером работы(в примере...

Битовые операции - C++
Имеется число int x = 85; // 1010101 - двоичное представление // 6543210 - номера битов // нужно взять // 0,2,3,4 биты и сложить...

Битовые операции - C++
Здравствуйте! нужно решить задачу: в целом числе заменить младший бит старшего байта на 1 решается ли это битовыми сдвигами? и...

битовые операции - C++
надо написать ф-цию, которая в данном числе(в двоичной с.с.) на заданном номере ставила 1, вместо 0

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Thinker
Эксперт C++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
06.12.2011, 11:41     Битовые операции, n-ый бит #2
Цитата Сообщение от cybergirl Посмотреть сообщение
Подскажите, пожалуйста!
Дано число x. Как установить на место n-ого бита единицу?
x = x | (1 << n);
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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
Ушёл с форума.
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
Эксперт CАвтор FAQ
17547 / 5785 / 370
Регистрация: 30.03.2009
Сообщений: 15,931
Записей в блоге: 26
06.12.2011, 12:41     Битовые операции, n-ый бит #8
На всякий случай. Если взять у автора из исходника строку номер 7:

C
1
x = (x & ~ (1<<n)) | (i << n);
то получится код, который выставляет n'ый бит в значение i (i - динамическая величина, равная нулю или единице). При этом 6-ю строку со сдвигом надо выкинуть. Т.е. изначально задача по сути была решена правильно (по общей формуле записи битового поля произвольной длины), только 6-я строка была лишняя
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
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
06.12.2011, 12:59     Битовые операции, n-ый бит #10
Цитата Сообщение от taras atavin Посмотреть сообщение
1<<16
Если sizeof(int) == 2, то эта запись бессмысленна совершенно.
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++
Задача. Я не понимаю что тут делать. Кто то что то понимает? Элементарное я понимаю сдвиги и прочее но это вообще:wall: Умоляю,...

битовые операции - C++
при zt=13653, yt=0, xt=9949 for (k = 0; k&lt;16; ++k) { d = zt &gt;&gt; 15; std::cout &lt;&lt; d&lt;&lt; &quot;\t&quot;; t =...

Битовые операции - C++
Есть код signed int a = 10; a = !a; cout &lt;&lt; a; Выводит 0, объясните, почему??

Битовые операции - 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-ый бит
Ответ Создать тему
Опции темы

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