簡體   English   中英

你能給我解釋一下這段按位運算符的代碼嗎? [復制]

[英]Can you explain this code of bitwise operator to me? [duplicate]

void printPowerSet(char *set, int set_size) {

  unsigned int pow_set_size = pow(2, set_size);
  int counter, j;

  for (counter = 0; counter < pow_set_size; counter++) {
    for (j = 0; j < set_size; j++) {

      if (counter & (1 << j))
        cout << set[j];
    }
    cout << endl;
  }
}

我無法理解這里的if (counter & (1 << j))部分。 這段代碼如何給出集合set {a,b,c}子集?

主循環從 0 迭代到 (2^set_size)-1。 例如,如果集合中有三個元素,它將從 0 迭代到 7 ((2^3)-1)。 如果用二進制表示,它將是:000、001、010、011、100、101、110、111。這些都是三元素集的子集(1 - 我們取元素,0 - 我們不取元素拿着)。 現在你只需要迭代並檢查我們是否取第 j 個元素(如果第 j 位等於 1)。 最簡單的方法是檢查 (i & (2^j)) 是否等於非零值(& 是一個按位運算,對於數字中的每個 position,如果兩個數字都在這個 position 上,則返回 1一點亮,其他情況下為 0)。 if 操作將 0 視為 false 並將正值視為 true,因此如果第 j 位點亮,則該操作將返回 2^j 並且它將是一個 true 值,因此該元素將被帶入該子集,否則如果位未點亮操作將返回 0,因此該元素不在該子集中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM