使用 unsigned char,您可以存储0 到 255之间的数字
255 (b10) = 11111111 (b2) <= 那是 1 个字节
这将使执行诸如 +,-,*... 之类的操作变得容易
现在怎么样:
255 (b10) = 10101101 (b2)
遵循此方法将可以使用 unsigned char最多表示399 ?
399 (b10) = 11111111 (b2)
有人可以提出一种算法来使用最后一种方法进行加法吗?
使用 unsigned char,您可以存储0 到 255之间的数字
255 (b10) = 11111111 (b2) <= 那是 1 个字节
这将使执行诸如 +,-,*... 之类的操作变得容易
现在怎么样:
255 (b10) = 10101101 (b2)
遵循此方法将可以使用 unsigned char最多表示399 ?
399 (b10) = 11111111 (b2)
有人可以提出一种算法来使用最后一种方法进行加法吗?
八位只有 256 个可能的值 (2 8 ),无论您如何切片和切块。
您以 2-3-3 形式对数字进行编码的方案,例如:
255 = 10 101 101
399 = 11 111 111
忽略了这样一个事实,即那里的那些三位序列只能表示八个值(0-7),而不是十个(即,第二个值是 377,而不是 399)。
权衡是这意味着您获得数字'25[6-7]'
(2 个值)'2[6-7][0-7]'
(16 个值)和'3[0-7][0-7]'
(64 个值),总共 82 个值。
您为获得该收益所做的牺牲是,您不能再表示任何包含8
或的数字9
:'[8-9]'
(2 个值)、'[1-7][8-9]'
(14 个值)、'[8-9][0-9]'
(20 个值)、'1[0-7][8-9]'
(16 个值)、'1[8-9][0-9]'
(20 个值)或'2[0-4][8-9]'
(10 个值),总计82 个值。
那里的平衡(82 对 82)表明,对于 8 位数据类型,仍然只有 256 个可能的值。
所以你的编码方案是基于一个有缺陷的前提,这使得你问题的第二部分(如何添加它们)无关紧要,恐怕。
一个unsigned char
类型只能在数学上保持介于0
和255
由规则确定的位数量可以表示2^n - 1
的最大无符号值之间的值。n
没有办法“改进” char 范围,您可能想使用一个unsigned short
包含两个字节的 an 。
你错了。
在您的方案中,255 将是 010101101,即 9 位。前导零很重要。我在这里假设您使用的是看起来像八进制表示的东西。3 位/位。任何其他替代方法都意味着您不能代表所有其他数字。
|0|000|
|1|001|
|2|010|
|3|011|
|4|100|
|5|101|
|6|110|
|7|111|
|8|???|
|9|???|
二进制中的 9 是 1001。所以你不能每个数字使用 3 位。如果要表示 8 和 9,则需要使用 4 位。同样,我在这里尝试假设您分别对每个数字进行编码。因此,根据您的说法,399 将是:001110011001 - 12 位。相比之下,二进制在 110001111 - 9 位中执行 399。
所以二进制是最有效的,因为在您的系统中编码从 0 到 9 的数字意味着您可以在不丢失任何 8 位信息的情况下存储的最大数字是 99 - 10011001 :)
考虑二进制的一种方式是通过日志搜索找到数字的路径。
如果您真的想压缩表示数字所需的位数,那么您真正需要的是某种压缩,而不是二进制的完成方式。
你想做的事情在数学上是不可能的。您只能用 8 个布尔值表示 256 个离散值。
要对此进行测试,请制作一张包含十进制和二进制所有可能值的图表。IE
000 = 00000000
001 = 00000001
002 = 00000010
003 = 00000011
004 = 00000100
...
254 = 11111110
255 = 11111111
您会看到,在 255 之后,您需要第九位。
你可以让255 = 10101101
,但如果你从那开始倒退,你会在达到 0 之前用完。
您似乎希望您能以某种方式使用不同的计数机制来存储更多值。这在数学上是不可能的。参见Pidgeonhole 原理。