s |= 1 << (v - 1); s = s | (1 << (v - 1)); s := s or (1 shl (v - 1)) 1 shl (v - 1) shl = Shift Left, побитовый сдвиг a << b <=> a * 2^b shr == Shift Right a >> b <=> a div 2^b Пример: n = 4 {1, 3, 4} 3 1 3 4 s = 0 s |= 2^0 (1 -> 0) s |= 2^2 (3 -> 2) s |= 2^3 (4 -> 3) s = 1101_2 = 13 3210 номер бита | побитовое ИЛИ & побитовое И ^ побитовое исключающее ИЛИ 01001011 01001011 01001011 OR AND XOR 10011010 10011010 10011010 = = = 11011011 00001010 11010001 s = 0000 s |= 0001 s |= 0100 s |= 1000 ========= s == 1101 Дальше: if ((t & s) == s) t -- надмножество s все биты, которые 1 в s, также 1 в t {единицы и в s, и в t} = {единицы в s} S пересечь с T = S Перебор подмножеств подмножеств: t = 00110010 00110010 подмножества t: s = 00110010 s-1 = 00110001 00110000 00101111 00100010 00100001 00100000 00011111 00010010 00010001 00010000 00001111 00000010 00000001 00000000 11111111 виртуально: 1...00000000 0...11111111 Переходы по одному биту: 00100011 -> 11101011 00100011 00101011 01101011 11101011 t = 11101011 s = 11101010 s = 11101001 s = 11100011 s = 11001011 s = 10101011 s = 01101011 Другой порядок циклов: 0-й бит: 001 <- 000 011 <- 010 101 <- 100 111 <- 110 1-й бит: 010 <- 000 011 <- 001 110 <- 100 111 <- 101 2-й бит: 100 <- 000 101 <- 001 110 <- 010 111 <- 011