Member 13881359 Ответов: 1

Что означает следующий код?


int printSubset(char *set,int &elements)
{
	int total_subsets = pow(2,elements);
	cout<<"\n Total subset are = 2^"<< elements <<" = "<< total_subsets <<endl;
	cout<<"\nEmpty set";
    
    for(int c=0; c<total_subsets; c++)
    {
      for(int j=0; j<elements; j++)
       {
		if(c&(1<<j))
          {
          	 cout<< set[j];
          }          
	  }
	  cout<<"\n\n";
    }
}


Что я уже пробовал:

На самом деле этот код предназначен для создания подмножеств множества
Но я не понимаю следующий код который как это работает


Особенно это касается
если условие так, то пожалуйста скажите мне о условии.
for(int c=0; c<total_subsets; c++)
{
  for(int j=0; j<elements; j++)
   {
if(c&(1<<j))
      {
         cout<< set[j];
      }
   }
  cout<<"\n\n";
}

1 Ответов

Рейтинг:
1

OriginalGriff

Когда вы не понимаете немного кода, посмотрите на него и разбейте его на составные части.

if(c&(1<<j))
Распадается на
if (...)
и
c&(1<<j)
Первая часть я знаю, вы понимаете - это нормально if, а вторая часть-это условие, которое оценивается как истинное или ложное.
c & (1 << j)
;Также состоит из двух частей:
c & ...
И
1 << j
Первая часть является двоичной и имеет два значения: c и вторая часть, а двоичная и проста: для каждого бита на входах результирующий бит равен 1 тогда и только тогда, когда оба входных бита равны 1. В противном случае это 0. (Интересные факты о побитовых операторах в C - GeeksforGeeks[<a href="https://www.geeksforgeeks.org/interesting-facts-bitwise-operators-c/" target="_blank" title="новое окно>^] должно помочь)
Вторая часть также проста: это 1 сдвинутый j мест вправо (ссылка выше также объясняет это). Таким образом, если j равно 0, то это приводит к 1, для j == 1 это приводит к 2, для j = 2 это дает 4, и так далее.

Таким образом, весь if проверяет наличие 1 бита в определенной позиции в c

Все это есть в документации: Операторы в C / C++ - GeeksforGeeks[^]