Why is CDMA so complicated, wouldn't this simpler solution work? I am now reading about Code Division Multiple Access method (CDMA), which is used for multiple hosts to send data at the same time. 

The main idea behind it is to use orthogonal vector basis to encode multiple bit streams into one, send the joined stream across the link, then decode the stream differently for every separate message.

What confuses me is that in digital logic negative numbers are introduced, as well as 0 indicating no signal. 

When I first heard that such encoding exists, my first idea of how it should work was different from the original and it looks way simpler.

Could someone check and add comments to my method? WHY is it not used instead of ORIGINAL CDMA?

Outline of my solution

I take n orthogonal vectors (where xor is the addition operation in my vector space), each vector corresponding to one chip code. I then encode every bit as a chip code if it is 1, as 0 otherwise. Finally, I xor all bit sequences together and send the joined result. At the other end, recipient can decompose the bit stream into unique components and read the message of every host.

Solution in more details


Assumptions


There are n hosts (numbered from 0 up to n - 1), and all of them want to send b bits at the same time using the same link.
The receiver gets a joined bit stream, but is interested in reading the message of only one host (WLOG the message sent from the 0-th host).

Problem: create a protocol that would satisfy the assumptions.
My solution


For i-th host, assign a chip code to him of the form 2^i (power not xor here) written in binary. Call this chip code c(i). For example:

Chip code 1000..00 would be given to host 0 
Chip code 0100..00 would be given to host 1
...
Chip code 0000..01 would be given to host n-1.

Every single bit will be encoded using n bits.

if (host i wants to send 0) {
    encode it as 0000...00  // n zeroes 
} else {
    encode it as c(i)
}

For host i wishing to send j-th bit, call the encoded bit as e(i, j). For example: 

if (host i wants to send a bit stream, such that j-th bit is 1) { 
    e(i, j) = c(i)
} else {
    e(i, j) = 0;
}

For every j, compute 

d(j) = e(0, j) ^ e(1, j) ^ ... ^ e(n - 1, j)  // xor operation here

Concatenate d(0), d(1), ... d(n - 1) and send these n * b bits through the link. This will be the joined stream that the recipient at the other end should receive.
The recipient wishing to read the data sent by host 0 can look at (0-th, n-th, 2n-th, ..., b(n-1)-th) bits to see what the first host has sent.
The solution is simpler than original, because it uses only xor operation for encoding, and digits are only binary (i.e. no -2, +3 when doing vector addition). QED.



Does this solution work? If yes, why is it not used? The best reason I could guess is that we want to distinguish between hosts sending something and nothing. Are there other reasons?

Aside question: what are "nearly orthogonal" vectors in the context of CDMA?
Your solution works, and it is known by the name "time division multiple access" (TDMA). Basically, you assign time slots to each transmitter.

CDMA has several advantages compared to TDMA, but it also has its own disadvantages. Both schemes are inferior to more modern techniques such as OFDMA.

Main disadvantages of TDMA:


With data rate constant, the time slices become narrower as the number of transmitters increases. This means that the bandwidth also increases. With CDMA, you can increase the number of transmitters without increasing the bandwidth, by adding orthogonal code words.
TDMA requires very precise synchronization between transmitters. It is very hard to keep a large number of mobile units synchronized so that they won't transmit during the time slot of another unit. This may be solved using guardbands, but that decreases efficiency.


A couple of advantages of CDMA:


More resistance to fading and multipath. CDMA reflections are orthogonal to each other, so they cancel out.
If the codes are private, then there's a measure of inherent privacy.