1. A method for storing a plurality of data bits, the method comprising the steps of: (a) encoding the plurality of data bits to generate a codeword comprising at least one parity bit; (b) providing a plurality of memory cells, wherein each memory cell is programmable to a plurality of cell states; and (c) programming the plurality of memory cells to represent the plurality of data bits and the at least one parity bit, wherein every memory cell is programmed to represent at least one of the plurality of data bits by at least: defining a set of 2 j virtual states greater in number than the plurality of cell states and wherein j is an integer number; mapping the codeword to the set of 2 j virtual states; mapping the set of 2 j virtual states to the plurality of cell states; and placing each of the at least one memory cell in one of the plurality of cell states.