Пусть не int, а char (int8_t). mark: MARK: 0000: 0 MARK[0] = 10001000 0001: 0 0010: 0 0011: 1 0100: 0 0101: 0 0110: 0 0111: 1 1000: 0 MARK[1] = 00100110 1001: 1 1010: 1 1011: 0 1100: 0 1101: 1 1110: 0 1111: 0 k = 0: k = 1: k = 2: k = 3: 0000 -> 0001 0 1 0000 -> 0010 0 2 0010 -> 0011 2 3 0001 -> 0011 1 3 0100 -> 0101 4 5 0100 -> 0110 4 6 0110 -> 0111 6 7 0101 -> 0111 5 7 1000 -> 1001 1000 -> 1010 1010 -> 1011 1001 -> 1011 1100 -> 1101 1100 -> 1110 1110 -> 1111 1101 -> 1111 10001000 00100110 ........ MARK[1] |= MARK[0] ^ ^ ^ ^ ^^ ^^ ^^^^ 0 -> 8 . . . . .. .. .... 1 -> 9 2 -> 10 ... 7 -> 15 Для 32-битных int: 31-й бит: множества, кончающиеся на ....11111 27-й бит: множества, кончающиеся на ....11011 bit31 |= bit27 MARK[1] |= MARK[0] 0 -> 32 1 -> 33 2 -> 34 ... 31 -> 63 01010101_2 = 55_16 = 0x55 = 0b01010101 (since C++14) 00110011_2 = 33_16 = 0x33 = 0b00110011 00001111_2 = 0F_16 = 0x0F = 0b00001111