(Updated October 2, 2024)
8,000,000 possible numbers. 8M bits in 1M bytes. byte[] ba = new byte[1000000]; ba[0] ba[1] ba[2] ba[3] | byte0 | byte 1 | byte 2 | ... 01234567 01234567 01234567 ^ ^ | | 2000007 2000023 byte 0 01234567 ^^^^^^^^ |||||||└ 2000007 ||||||└ 2000006 |||||└ 2000005 ||||└ 2000004 |||└ 2000003 ||└ 2000002 |└ 2000001 └ 2000000 0x80 == 10000000 10110000 | 10000000 0x80 ---------- 10110000 00100101 start | 10000000 mask ---------- 10100101 result ------------------------------- Reading from the input file and populating the bitmap array... 2000176 - 2000000 -> 176 176 / 8 -> byte 22 176 % 8 -> bit 0 2000007 - 2000000 -> 7 / 8 -> 0 7%8 -> 7 2 R 7 --- 8 | 23 -16 ---- 7 Remainder 0x80 >>> 0 -> 10000000 0x80 >>> 3 -> 00010000 0x80 >>> 7 -> 00000001 2000023 - 2000000 -> 23 / 8 -> 2 23 % 8 -> 7 ba[2] = ba[2] | 0x80 >>> 7; pn = pn - 2000000; pnbyte = pn / 8; pnbit = pn % 8; 2000007 / 8 -> 250000 2000007 % 8 -> 7 ba[250000] 9999999 / 8 -> 1,249,999 9999999 - 2000000 -> 7999999 / 8 -> 999,999 ------------------------------- Writing back to the output file... 00100101 start & 10000000 mask ---------- 00000000 result 00100101 start & 01000000 mask ---------- 00000000 result 00100101 start & 00100000 mask ---------- 00100000 result This translates to:
if ( (ba[x] & mask) != 0)
// write the number to file.
0x80 >>> 1 -> 01000000 >>> 1 -> 00100000 >>> 1 -> 00010000 The code roughly translates to:
For the range of bytes
For the range of bits
if ( (ba[by] & (0x80 >>> bit)) != 0) {
pn = 2000000 + by * 8 + bit;
// write the number to the output file.
}