A method of data compression comprising: receiving a plurality of data items represented using two's complement; encoding groups of data items by generating, for each of the groups, header data comprising h bits and a plurality of body portions each comprising b bits and each of the body portions corresponding to a data item in the group, wherein b is fixed within a group and wherein the header data for a group comprises an indication of b for the body portions of that group, wherein encoding groups of data items comprises, for each of the groups: receiving the group of data items; identifying a body portion size, b, by locating a bit position of a most significant leading one across all the data items in the group; generating the header data comprising a bit sequence encoding the body portion size; and generating a body portion comprising b bits for each of the data items in the group by removing one or more leading zeros from each data item, generating, for each of the groups where b>0, a body data field for the group by interleaving bits from the body portions corresponding to data items in the group; and storing (108, 109) one or more encoded data blocks (214, 216) comprising the header data and the body data fields, wherein if the data items have a distribution centred on zero, the method further comprises, prior to encoding a group of data items, pre-processing the data items in the group by converting all data items having a negative value to positive values and interleaving the converted data items with data items having a positive value, or wherein if the data items have a distribution centred on a non-zero value, the method further comprises, prior to encoding a group of data items, pre-processing the data items in the group by shifting all data items such that the shifted distribution is centred on zero and then converting all shifted data items having a negative value to positive values and interleaving the converted shifted data items with shifted data items having a positive value. receiving a plurality of data items represented using two's complement; encoding groups of data items by generating, for each of the groups, header data comprising h bits and a plurality of body portions each comprising b bits and each of the body portions corresponding to a data item in the group, wherein b is fixed within a group and wherein the header data for a group comprises an indication of b for the body portions of that group, wherein encoding groups of data items comprises, for each of the groups: receiving the group of data items; identifying a body portion size, b, by locating a bit position of a most significant leading one across all the data items in the group; generating the header data comprising a bit sequence encoding the body portion size; and generating a body portion comprising b bits for each of the data items in the group by removing one or more leading zeros from each data item, generating, for each of the groups where b>0, a body data field for the group by interleaving bits from the body portions corresponding to data items in the group; and storing (108, 109) one or more encoded data blocks (214, 216) comprising the header data and the body data fields, wherein if the data items have a distribution centred on zero, the method further comprises, prior to encoding a group of data items, pre-processing the data items in the group by converting all data items having a negative value to positive values and interleaving the converted data items with data items having a positive value, or wherein if the data items have a distribution centred on a non-zero value, the method further comprises, prior to encoding a group of data items, pre-processing the data items in the group by shifting all data items such that the shifted distribution is centred on zero and then converting all shifted data items having a negative value to positive values and interleaving the converted shifted data items with shifted data items having a positive value. receiving the group of data items; identifying a body portion size, b, by locating a bit position of a most significant leading one across all the data items in the group; generating the header data comprising a bit sequence encoding the body portion size; and generating a body portion comprising b bits for each of the data items in the group by removing one or more leading zeros from each data item, generating, for each of the groups where b>0, a body data field for the group by interleaving bits from the body portions corresponding to data items in the group; and storing (108, 109) one or more encoded data blocks (214, 216) comprising the header data and the body data fields, wherein if the data items have a distribution centred on zero, the method further comprises, prior to encoding a group of data items, pre-processing the data items in the group by converting all data items having a negative value to positive values and interleaving the converted data items with data items having a positive value, or wherein if the data items have a distribution centred on a non-zero value, the method further comprises, prior to encoding a group of data items, pre-processing the data items in the group by shifting all data items such that the shifted distribution is centred on zero and then converting all shifted data items having a negative value to positive values and interleaving the converted shifted data items with shifted data items having a positive value.