Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Поразрядные операторы


Автор: bITA 5.11.2021, 17:59
Возможностью проверять состояние отдельных двоичных разрядов с помощью по­ разрядного оператора & можно воспользоваться для написания программы, в которой отдельные двоичные разряды проверяемого значения типа 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

Подскажите правильно ли я понял процесс проверки отдельного бита? Если есть нюансы просветите меня

Автор: Aa1 6.11.2021, 03:22
Тогда уж пишите не
Код
if ((val & t) == 1)

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

Автор: 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. И единице оно будет равно только в одном единственном случае (что вы и видели)

Автор: bITA 13.11.2021, 11:53
Цитата(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 + " — нечетное 
    число.");
    }
 
.... но в этом как то сложно.
Почему так не происходит в данном примере? 

Автор: xvr 13.11.2021, 13:13
Цитата(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


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

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

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


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)