Look at the code below from android bitcoin wallet:

proofOfWorkLimit = Utils.decodeCompactBits(0x1d00ffffL);

And look at the code from bitcoin qt wallet:

static CBigNum bnProofOfWorkLimit(~uint256(0) >> 32);

I assume that in second case ProofOfWorkLimit is 32 "0" and 224 "1" (000000...000111111111....11111111)?

So I don't have an idea how to get first case "0x1d00ffffL" from second case? In binary "0x1d00ffffL" is 11101000000001111111111111111.

P.S. I have looked in uint256.h. It wasn't helpful.


The first byte, 1D, is the length. The next three bytes are the high bytes of the hash. So we have 00ffff, then we add ff bytes onto the end to get to 29 bytes. Then we're done.

We wind up with 3 bytes of leading zeroes because 32-29 is 3. And we get one byte of zeroes from the second byte of the compact bits. So the final result is 00,00,00,00,ff,ff,ff...

  • Thanks for reply. I am still confused. Can your answer how to get "first case" from "static CBigNum bnProofOfWorkLimit(~uint256(0) >> 27);" ? – Vitali Grabovski Apr 18 '14 at 9:02
  • ~0 means all bits set. >> 32 means to shift the bits left by 32 bits, shifting in zeroes in their place. – David Schwartz Apr 18 '14 at 9:16
  • Thanks again. Sorry for insistence but can you answer what exactly should I put here "Utils.decodeCompactBits(0x1d00ffffL);" in case "~uint256(0) >> 27" ? – Vitali Grabovski Apr 18 '14 at 10:35
  • 1
    You want 27 zero bits. That's 3 bytes of all zero bits, followed by 3 more zero bits. 00011111 is 1F. Since the whole thing is 32 bytes, and we need 3 zero bytes, the length of the non-zero segment is 29 bytes, which in hex is 1D. So unless I made a mistake, I get 0x1D1FFFFF. – David Schwartz Apr 19 '14 at 20:27

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.