如何对具有非标准二进制表示的数字进行算术运算?

时间:2012-03-06 03:17:56

标签: c++ range unsigned-char

使用unsigned char,您可以存储 0到255

中的数字

255 (b10)= 11111111 (b2)< =那是1个字节

这样可以轻松地执行+, - ,* ...

等操作

现在怎么样:

255 (b10)= 10101101 (b2)

使用此方法可以使用unsigned char表示最多 399 吗?

399 (b10)= 11111111 (b2)

有人可以提出一种算法来使用最后一种方法进行加法吗?

4 个答案:

答案 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个值。

您的牺牲获得的收益是,您无法再代表包含89的所有数字:'[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类型只能在0255之间以数学方式保存值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