负二进制表示法——“奋斗杯”编程大赛题目

本文探讨了负二进制表示法的概念,通过举例解释了如何将十进制数转换为负二进制,并在思考部分详细讨论了转换过程中的特殊情况。文章最后提供了Golang和Java的代码实现,用于将整数转换为负二进制表示。

0、题目

计算机里的数都是二进制表示,其实还有一种负二进制表示法,都不需要符号位。

如 3 的负二进制表示法为 111,因为 (-2)2 + (-2)1 + (-2)0 = 4-2+1 = 3

再如 -3 的负二进制表示法为 1101,因为 (-2)3 + (-2)2 + (-2)0 = -8+4+1 = -3

要求输入一个整数,输出其负二进制表示。

  • Golang
  • Java

1、思考

指数
0 (-2)0 1
1 (-2)1 -2
2 (-2)2 4
3 (-2)3 -8
4 (-2)4 16
5 (-2)5 -32

由表可知,负二进制理论上可以表示计算机位数范围内的任意整数值。
准备几个特殊的值备用,(0)10 = (0)-2 , (1)10 = (1)-2 , (-1)10 = (11)-2

首先回忆一下十进制转二进制的方法,除2取余倒着写,嗯,我们先试一下,看看能不能也用到负二进制的换算上。

1.1 先试一个简单的值 16

  • 16/(-2) = -8 ······ 0
  • -8/(-2) = 4 ······ 0
  • 4/(-2) = -2 ······ 0
  • -2/(-2) = 1 ······ 0

所以 (16)10 = (10000)-2 ,嗯,看起来好像没毛病。

1.2 再试一下题干中的值3

  • 3/(-2) = -1 ······ 1
  • -1/(-2) = 0 ······ -1

呃,好像哪里不对,虽然根据之前的特殊值 (-1)10 = (11)-2 ,可以推出 3/(-2) 商为 -1 余数为 1,所以 (3)10 = (111)-2,貌似也搞定了。

1.3 试一下特殊值-13

先在代码里运行一下 -13/(-2),得到商为6,余数为-1。等等,余数为-1是什么鬼,余数不应该是1或者0吗?再想想,应该得到的商为7,余数为1,这样就行了。于是:

  • -13/(-2) = 7 ······ 1
  • 7/(-2) = -3 ······ 1
  • -3/(-2) = 2 ······ 1
  • 2/(-2) = -1 ······ 0
  • -1/(-2) = 1 ······ 1
    所以,(-13)10 = (110111)-2
    验算一下,(-2)5+(-2)4+(-2)2+(-2)1+(-2)0 = -32+16+4-2+1 = -13 。没毛病!

结论,当被除数为负数,余数为-1时,计算所得的商应该加一,余数就变为正1

2 代码实现go和java

//go语言实现
func intToNegativeBinary(n 
评论 17
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值