使用unsigned char,您可以存储 0到255
中的数字255 (b10)= 11111111 (b2)< =那是1个字节
这样可以轻松地执行+, - ,* ...
等操作现在怎么样:
255 (b10)= 10101101 (b2)
使用此方法可以使用unsigned char表示最多 399 吗?
399 (b10)= 11111111 (b2)
有人可以提出一种算法来使用最后一种方法进行加法吗?
答案 0 :(得分:5)
对于8位,只有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 (14个值),'[1-7][8-9]'
(20个值),'[8-9][0-9]'
(16个值),'1[0-7][8-9]'
(20个值)或'1[8-9][0-9]'
(10个值),总计82个值。
那里的平衡(82对82)表明,对于8位数据类型,仍然只有256个可能的值。
所以你的编码方案是基于一个有缺陷的前提,这使你的问题的第二部分(如何添加它们)无关紧要,我担心。
答案 1 :(得分:2)
unsigned char
类型只能在0
和255
之间以数学方式保存值2^n - 1
确定的最大无符号值,即位数{{1}可以代表。没有办法“改进”一个char范围,你可能想要使用一个n
代替两个字节。
答案 2 :(得分:0)
在您的方案中,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:)
想到二进制文件的一种方法是通过日志搜索查找数字的结果。
如果你真的想要压缩表示数字所需的位数,你真正想要的是某种压缩,而不是二进制的完成方式。
答案 3 :(得分:0)
您想要做的事情在数学上是不可能的。您只能使用8个布尔值表示256个离散值。
要对此进行测试,请以十进制和二进制形式显示所有可能值的图表。即。
000 = 00000000
001 = 00000001
002 = 00000010
003 = 00000011
004 = 00000100
...
254 = 11111110
255 = 11111111
你会看到在255之后,你需要第九位。
你可以让255 = 10101101
,但是如果你向后工作,你会在达到0之前用完。
您似乎希望您能以某种方式使用不同的计数机制来存储更多值。这在数学上是不可能的。请参阅Pidgeonhole Principle。