The table in the Kindle edition seems to say that you compute x+1 with !(!x + 1) [nx, zy, ny, f=+, no], and conversely that you get x - 1 by taking x + 1 [zy, ny, f=+].

Has that just been switched around or am I confused? (Similarly for figure 4.3)

The result of zy and ny is that y is zeroed and then bitwise negated, so it will be 1111 1111 1111 1111 (or -1 in decimal). You seem to be under the impression that it will be 1 (boolean not). Let's examine x = 4, zx = 0, nx = 1, zy = 1, ny = 1, f = 1, no = 1

Many thanks! Yes, I indeed managed to confuse myself by thinking that flipping 0 got you 1, probably because I was thinking of the 0 as a single bit and not the full n bits.

As an aside, it's really interesting for me from the standpoint of how my (broken) brain works, because I was really was thinking in terms of bit-flipping (ie. trying to puzzle through the algebra on paper, I was writing things like f(x) = 2^n - x - 1). Hard to get what I'm trying to express. It's not a case of consistently thinking a wrong thing such that correcting that wrong view fixes the problem. It's more like a sort “flaky wiring” where you can think the right thing in one half of a sentence and then somehow switch to thinking the exact opposite in the other half!

I too missed the bit wise negation, thinking Not 0 is 00..01. To be fair to the course it does say:

"The zy and ny bits are
1, so the y input is first zeroed, and then negated bit-wise. Bit-wise negation of zero, (000 ...00) two , gives
(111 ...11) two , the 2’s complement code of -1."

Phew, I was thinking fig 2.6 was completely wrong, as it turned out I was. But at least we're making the same mistakes.

Great course btw, thanks all involved with Nand2Tetris.