Excel实现有符号十进制数转二进制数

  最近需要用到将Excel中范围为-1023~+1023的数据转换为二进制,其实这个问题完全可以通过Matlab编程来解决,但是呢,得到的结果要重新复制进Excel表格中,也没有那么方便,所以想直接用Excel中的公式来进行十进制转二进制操作。
  Excel中自带十进制转二进制的函数,DEC2BIN,就是这个函数,我们来看一下这个函数的用法,这个函数有两个参数,number[places],这里的[places]指的是要使用的字符数,什么意思呢,我们先来看一个简单的例子。
  =DEC2BIN(2)
  =DEC2BIN(2,3)
  =DEC2BIN(2,0)
  我们先看第一个式子,这个式子的计算结果是11,答案很显然。那我现在把式子换成下面那个呢,结果会变成什么呢。第二个式子的结果是011,也就是[places]的意思是最后生成的字符串长度,那假如说,我们现在有第三个式子,这个式子的结果是什么呢。编程直觉告诉我,答案应该跟一式一样,不过很遗憾的是我错了,显示的结果是#NUM!。意思很明确,就是说如果实际长度超过[places],那么就会返回错误。
  看完[places]这个参数,我们再来看一下number这个参数。这个参数的范围是-512~511。但是我现在想要处理的数据范围是-1023~1023,那怎么弄呢。先不管负数那部分,我先只考虑正数这部分。一个大于511的正数要如何转化为二进制呢。后来想了一下,把这个数分为两部分,我们设这个正数为A吧。一部分为A除以512得到的整数结果,另一部分是A除以512得到的商,我们分别设这两部分为BC,很显然,对于一个小于512*512A,得到的BC都是512以内的,那么我们对BC分别进行十进制转二进制运算就可以得到正确结果了。
  那么如何去考虑负数呢,我们考虑一下正负数的二进制之间的关系。对于范围在-1023~+1023之间的数字,其二进制可以用11位来表示,我们考虑一下-1转换为11位的有符号二进制数,得到的结果是11111111111。我们把最高位抛去,就是101,把这串字符串当成无符号型十进制整数,就是1023。也就是对于一个-1023~-1的负数,转换为11位的二进制数,其最高位为1,后面的10位就是该值加上1024得到结果的二进制数,于是我就写了如下代码。
=IF(A6>=0,DEC2BIN(A6/512,2)&DEC2BIN(MOD(A6,512),9),1&DEC2BIN((A6+1024)/512,1)&DEC2BIN(MOD((A6+1024),512),9))
  这段代码什么意思呢,首先是一个IF语句,判断当前位置的数是正数还是负数,如果是正数,则执行前面部分,若为负数,则执行后面部分内容。在正数情况下,将该数值分为两部分,将除以512得到的商转换为一个2位的二进制数值,可想而知,因为该数小于1024,所以这个二进制数的第一位肯定为0。将除以512得到的余数转换为一个9位的结果。于是对于一个小于1024的正数,其二进制数就可以求取出来了。这里有个要注意的细节在于这里的等号,一般情况下,等于的情况两边都能成立,但是这里不是,只有前边的情况能满足,后边的情况不能满是,因为0+1024=1024,而1024必须用11位二进制进行表示。
  后半部分是负数情况下的求取,我们先把这个负数加上1023,再把得到的这个正数转换为11位的二进制数,转换方法跟前面的一致,然后再在前面添一个符号位1,构成了一个1位的有符号型二进制数。
  442 => 00110111010
  -63 => 11111000001
  看一下计算结果,结果显示计算是正确的。

原创文章 26 获赞 35 访问量 6万+

猜你喜欢

转载自blog.csdn.net/love_ljq/article/details/77750972
今日推荐