Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поразрядные операторы, Как устанавливаются и сбрасываются биты 
:(
    Опции темы
bITA
  Дата 5.11.2021, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 6.12.2020

Репутация: нет
Всего: нет



Возможностью проверять состояние отдельных двоичных разрядов с помощью по­ разрядного оператора & можно воспользоваться для написания программы, в которой отдельные двоичные разряды проверяемого значения типа byte приводятся в двоич­ ной форме. Ниже показан один из способов написания такой программы.

// Показать биты, составляющие байт.
Код
 
using System;
class ShowBits { 
    static void Main() {
    int t;
    byte val;
    val = 123;
    for (t=l28; t > 0; t = t/2) {
        if((val & t) != 0) Console.Write("1 ");
        if((val & t) == 0) Console.Write("0 ");
     } 
   }

 
Выполнение этой программы дает следующий результат.
0 1 1 1 1 0 1 1 

В цикле for из приведенной выше программы каждый бит значения переменной val проверяется с помощью поразрядного оператора И, чтобы выяснить, установлен ли этот бит или сброшен. Если он установлен, то выводится цифра 1, а если сброшен, то выводится цифра 0.

Если в выражении:

Код
 
if(val & t) != 0)
 
заменить оператор неравенство на равенство ( == ) и заменить 0 на 1. Почему такой результат? :
0
0
1

Подскажите правильно ли я понял процесс проверки отдельного бита? Если есть нюансы просветите меня
PM MAIL   Вверх
Aa1
Дата 6.11.2021, 03:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 26.11.2012

Репутация: нет
Всего: 1



Тогда уж пишите не
Код
if ((val & t) == 1)

а
Код
if ((val & t) == t)

PM MAIL   Вверх
xvr
Дата 8.11.2021, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(bITA @  5.11.2021,  17:59 Найти цитируемый пост)
заменить оператор неравенство на равенство ( == ) и заменить 0 на 1. Почему такой результат?

Потому что в цикле результат (val & t) совсем не 0/1, а 0 64 32 16 8 0 2 1. И единице оно будет равно только в одном единственном случае (что вы и видели)

PM MAIL   Вверх
bITA
Дата 13.11.2021, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 6.12.2020

Репутация: нет
Всего: нет



Цитата(xvr @ 8.11.2021,  18:47)
Цитата(bITA @  5.11.2021,  17:59 Найти цитируемый пост)
заменить оператор неравенство на равенство ( == ) и заменить 0 на 1. Почему такой результат?

Потому что в цикле результат (val & t) совсем не 0/1, а 0 64 32 16 8 0 2 1. И единице оно будет равно только в одном единственном случае (что вы и видели)

Можешь подробно объяснить почему так происходит?
 ) == 0) - это проверка младшего разряда. В предыдущем примере я понял.... 
Код
 
using System;
class IsOdd { 
    static void Main() { ushort num;
    num = 10;
    if((num & 1) == 1) Console.WriteLine("He выводится.");
    num = 11;
    if((num & 1) == 1) Console.WriteLine(num + " — нечетное 
    число.");
    }
 
.... но в этом как то сложно.
Почему так не происходит в данном примере? 

Это сообщение отредактировал(а) bITA - 13.11.2021, 11:55
PM MAIL   Вверх
xvr
Дата 13.11.2021, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(bITA @  13.11.2021,  11:53 Найти цитируемый пост)
Можешь подробно объяснить почему так происходит?

Потому что так работают битовые логические операции. Ваше исходное число 123 это 01111011  в бинарном виде. Складываем по И с бегущей единицей, получаем:
Код

01111011 & 10000000 = 00000000 = 0
01111011 & 01000000 = 01000000 = 64
01111011 & 00100000 = 00100000 = 32
01111011 & 00010000 = 00010000 = 16
01111011 & 00001000 = 00001000 = 8
01111011 & 00000100 = 00000000 = 0
01111011 & 00000010 = 00000010 = 2
01111011 & 00000001 = 00000001 = 1


PM MAIL   Вверх
bITA
Дата 13.11.2021, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 6.12.2020

Репутация: нет
Всего: нет



Так почему тогда при if((val & t) ! = 0) все тоже самое 123 & 128 а результат другой? 
PM MAIL   Вверх
xvr
Дата 15.11.2021, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(bITA @ 13.11.2021,  16:20)
Так почему тогда при if((val & t) ! = 0) все тоже самое 123 & 128 а результат другой?

Для 123 & 128 результат тот же - 0 при любом виде условия в if (==0 или !=1)
А вот там, где должна быть 1 на выходе результат будет другой. Там 123 & <число> будет не 1, а это самое <число>, так что на == 1 его сравнивать некорректно


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1259 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.