I'm a noob reading The C Programming Language by Kernighan & Ritchie. I'm on section 2.9 and am able to do basic calculations using the bitwise operators, but I still don't understand why they have some of the effects that they do in the examples shown in the book. I have absolutely no clue whats going on in the last example.

The bitwise AND operator & is often used to mask off some set of bits, for example
n = n & 0177;
sets to zero all but the low-order 7 bits of n.
I don't understand why this expression has that effect. Wouldn't n = 0; have the same effect? Or maybe n = ~0177;?

x = x & ~077
sets the last six bits of x to zero. Note that x & ~077 is independent of word length, and is
thus preferable to, for example, x & 0177700, which assumes that x is a 16-bit quantity.
What does x look like before the operation is performed. 16 0-bits or is it in some state I don't know about? And why is word length coming into this discussion out of nowhere?

As an illustration of some of the bit operators, consider the function getbits(x,p,n) that returns the (right adjusted) n-bit field of x that begins at position p. We assume that bit position 0 is at the right end and that n and p are sensible positive values. For example, getbits(x,4,3) returns the three bits in positions 4, 3 and 2, right-adjusted.
Code:
/* getbits: get n bits from position p */
    unsigned getbits(unsigned x, int p, int n)
    {
         return (x >> (p+1-n)) & ~(~0 << n);
    }
The expression x >> (p+1-n) moves the desired field to the right end of the word. ~0 is all 1-bits; shifting it left n positions with ~0<<n places zeros in the rightmost n bits; complementing that with ~ makes a mask with ones in the rightmost n bits.
My brain collapsed.

I'm having a really hard time visualizing what's actualy happening here. Some help would really be appreciated. Thanks.