You cannot really send the data without modification (0V - 0, some positive voltage - 1) over long lines noise can disrupt it and also, if the data contains a lot of "0" or "1" in sequence, the receiving device can lose count (was it 1000 zeros or 1001?), so line codes are used.
RS232, for example, just sends the data (also called non-return-to-zero (NRZ) code), +10V for "0" and -10V for "1". However, each byte is started with a "start" bit and ended with a "stop" bit. The receiver does not "lose count" within the byte, however, you have to send at least 10 bits to send 8 bits of useful information.
One of the simpler codes is called return-to-zero. Here "1" is represented by one voltage level (for example +5V), "0" is represented by another (for example -5V), but the signal returns to zero after half a bit.
Now the receiver will not lose count of the ones and zeros, but this code has two problems. 1) It uses twice the bandwidth (has double the frequency) of the bit rate and 2) if there is a long string of "0" or "1", the signal will have a DC component, which may be undesirable.
10Mbps Ethernet uses Manchester code, which still uses twice the bandwidth, but has no DC component. There are two versions of it, basically one is the inverse of the other. In the IEEE version, "1" is represented by low-to-high transition in the "middle" of a bit and "0" is represented by high-to-low transition in the middle of the bit.
There is also MLT-3 code, which uses 3 voltage levels. The code cycles trough -1, 0, +1 levels. If you need to transmit "1" then the code goes to the next level, if you need to transmit "0" then it stays the same, like this:
It does not require high frequencies (the frequency is about 0.25x bit rate), but is not self-clocking - a long string of zeros will result in the receiver "losing count".
However, there are also other codes, that are picked out from a table, for example, 4b/5b takes 4 data bits and encodes them to 5 bits on the wire. Then you can use MLT-3 or NRZ and the receiver will not lose count. There are also other codes - 8b/10b, 64b/66b.
If you want to know more, go to Wikipedia to read about line coding.
Also, a transmitter may add error correction codes to the bitstream, so that the receiver can detect and correct transmission errors, NICs (at least Ethernet) usually do not do that, because he cable is usually reliable and if there are errors, they are passed up the stack so the higher level protocols can deal with them.
For error correction, got to this Wikipedia article. Understanding error correction requires understanding of math :)