鱼C论坛

 找回密码
 立即注册
查看: 1720|回复: 7

[已解决]有什么办法把负整数符合要求

[复制链接]
发表于 2017-8-23 11:21:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
第015讲:字符串:格式化 | 课后测试题及答案
http://bbs.fishc.com/thread-40789-1-1.html
(出处: 鱼C论坛)


该题是在动动手的那一题:
我的答案如下,但是运行后,发现负整数反而不符合要求了,

temp = input('请输入一个整数(输入Q结束程序):')
zs = temp

while zs != 'Q':
        if zs.isdigit() is False:
                temp = input('您输入的不是整数,请再输入:')
                zs = temp
        else:
                z1 = eval(zs)
                z2 = str(z1)
                zz8 =str( '%o' % z1)
                zz16 = str( '%x' % z1)
                zz2 =str( bin(z1))
                print('十进制 -> 十六进制:' + z2 +'->' + zz16)
                print('十进制 -> 八进制:' + z2 +'->' + zz8)
                print('十进制 -> 二进制:' + z2 +'->' + zz2)
                temp = input('请输入一个整数(输入Q结束程序):')
                zs = temp
               
最佳答案
2017-8-23 11:47:17
所以不能,希望能帮到您
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-8-23 11:36:24 | 显示全部楼层

while True:
    dec = input("回车键进入,按Q/q退出:")


    if dec == "q" or dec == "Q":
        print("再见")
        break
    else:

        dec = input("输入数字:")

        while dec.isdigit() == False:
            print("输入格式不正确")
            dec = input("请输入整数:")
        dec = int(dec)
        print("十进制数为:", dec)
        print("转换为二进制为:", bin(dec))
        print("转换为八进制为:", oct(dec))
        print("转换为十六进制为:", hex(dec))
        dec = 0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-23 11:39:27 | 显示全部楼层
我们已经知道计算机中,所有数据最终都是使用二进制数表达。
我们也已经学会如何将一个10进制数如何转换为二进制数以及如何将如何将一个16进制数如何转换为二进制数,详见下图。


 
不过,我们仍然没有学习一个负数如何用二进制表达。
 
比如,假设有一 int 类型的数,值为5,那么,我们知道它在计算机中表示为:
00000000 00000000 00000000 00000101
5转换成二制是101,不过int类型的数占用4字节(32位),所以前面填了一堆0。
现在想知道,-5在计算机中如何表示?
 
在计算机中,负数以其正值的补码形式表达。
什么叫补码呢?这得从原码,反码说起。
 
原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
比如 00000000 00000000 00000000 00000101 是 5的 原码。
 
反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
取反操作指:原为1,得0;原为0,得1。(1变0; 0变1)
比如:将00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010。
称:11111111 11111111 11111111 11111010 是 00000000 00000000 00000000 00000101 的反码。
反码是相互的,所以也可称:
11111111 11111111 11111111 11111010 和 00000000 00000000 00000000 00000101 互为反码。
 
补码:反码加1称为补码。
也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。
比如:00000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。
那么,补码为:
11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011
 
所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。转换为十六进制:0xFFFFFFFB。
 
再举一例,我们来看整数-1在计算机中如何表示。
假设这也是一个int类型,那么:
 
1、先取1的原码:00000000 00000000 00000000 00000001
2、得反码:     11111111 11111111 11111111 11111110
3、得补码:     11111111 11111111 11111111 11111111
 
可见,-1在计算机里用二进制表达就是全1。16进制为:0xFFFFFF。
使用Windows7的用户可以使用自带的计算器来帮助学习十进制、八进制、十六进制与二进制间的相互转换,非常方便。


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-23 11:40:16 | 显示全部楼层
十进制数转换为二进制数时,由于整数和小数的转换方法不同,所以先将十进制数的整数部分和小数部分分别转换后,再加以合并。
中文名
十进制转二进制
外文名
Decimal system to binary system
应用学科
数学
适用领域范围
电子、编程、编码
目录
  1. 1 二进制转十进制
  2. 2 十进制转二进制
二进制转十进制
编辑
要从右到左用二进制的每个数去乘以2的相应次方
例如:二进制数1101.01转化成十进制
1101.01(2)=1*20+0*21+1*22+1*23 +0*2-1+1*2-2=1+0+4+8+0+0.25=13.25
所以总结起来通用公式为:
abcd.efg(2)=d*20+c*21+b*22+a*23+e*2-1+f*2-2+g*2-3
或者用下面这种方法:
把二进制数首先写成加权系数展开式,然后按十进制加法规则求和。这种做法称为"按权相加"法。
2的0次方是1(任何数的0次方都是1,0的0次方无意义)
2的1次方是2
2的2次方是4
2的3次方是8
2的4次方是16
2的5次方是32
2的6次方是64
2的7次方是128
2的8次方是256
2的9次方是512
2的10次方是1024
2的11次方是2048
2的12次方是4096
2的13次方是8192
2的14次方是16384
2的15次方是32768
2的16次方是65536
2的17次方是131072
2的18次方是262144
2的19次方是524288
2的20次方是1048576
即:

此时,1101=8+4+0+1=13
再比如:二进制数1000110转成十进制数可以看作这样:
数字中共有三个1 即第一位一个,第二位一个,第六位一个,然后对应十进制数即2的1次方+2的2次方+2的6次方, 即
1000110=64+0+0+0+4+2+0=70
十进制转二进制
编辑
1. 十进制整数转换为二进制整数

十进制整数转换为二进制整数采用"除2取余,逆序排列"法。具体做法是:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为0时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。
十进制整数转二进制
如:255=(11111111)B
255/2=127=====余1
127/2=63======余1
63/2=31=======余1
31/2=15=======余1
15/2=7========余1
7/2=3=========余1
3/2=1=========余1
1/2=0=========余1
789=1100010101(B)
789/2=394 余1 第10位
394/2=197 余0 第9位
197/2=98 余1 第8位
98/2=49 余0 第7位
49/2=24 余1 第6位
24/2=12 余0 第5位
12/2=6 余0 第4位
6/2=3 余0 第3位
3/2=1 余1 第2位
1/2得0 余1 第1位
原理:
众所周知,二进制的基数为2,我们十进制化二进制时所除的2就是它的基数。谈到它的原理,就不得不说说关于位权的概念。某进制计数制中各位数字符号所表示的数值表示该数字符号值乘以一个与数字符号有关的常数,该常数称为 “位权 ” 。位权的大小是以基数为底,数字符号所处的位置的序号为指数的整数次幂。十进制数的百位、十位、个位、十分位的权分别是10的2次方、10的1次方、10的0次方,10的-1次方。二进制数就是2的n次幂。
按权展开求和正是非十进制化十进制的方法。
下面我们开讲原理,举个十进制整数转换为二进制整数的例子,假设十进制整数A化得的二进制数为edcba 的形式,那么用上面的方法按权展开, 得
A=a(2^0)+b(2^1)+c(2^2)+d(2^3)+e(2^4) (后面的和不正是化十进制的过程吗)
假设该数未转化为二进制,除以基数2得
A/2=a(2^0)/2+b(2^1)/2+c(2^2)/2+d(2^3)/2+e(2^4)/2
注意:a除不开二,余下了!其他的绝对能除开,因为他们都包含2,而a乘的是1,他本身绝对不包含因数2,只能余下。
商得:
b(2^0)+c(2^1)+d(2^2)+e(2^3),再除以基数2余下了b,以此类推。
当这个数不能再被2除时,先余掉的a位数在原数低,而后来的余数数位高,所以要把所有的余数反过来写。正好是edcba
2.十进制小数转换为二进制小数
十进制小数转换成二进制小数采用"乘2取整,顺序排列"法。具体做法是:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,此时0或1为二进制的最后一位。或者达到所要求的精度为止。
然后把取出的整数部分按顺序排列起来,先取的整数作为二进制小数的高位有效位,后取的整数作为低位有效位。
十进制小数转二进制
如:0.625=(0.101)B
0.625*2=1.25======取出整数部分1
0.25*2=0.5========取出整数部分0
0.5*2=1==========取出整数部分1
再如:0.7=(0.1 0110 0110...)B
0.7*2=1.4========取出整数部分1
0.4*2=0.8========取出整数部分0
0.8*2=1.6========取出整数部分1
0.6*2=1.2========取出整数部分1
0.2*2=0.4========取出整数部分0
0.4*2=0.8========取出整数部分0
0.8*2=1.6========取出整数部分1
0.6*2=1.2========取出整数部分1
0.2*2=0.4========取出整数部分0
原理:
关于十进制小数转换为二进制小数
假设一十进制小数B化为了二进制小数0.ab的形式,同样按权展开,得
B=a(2^-1)+b(2^-2)
因为小数部分的位权是负次幂,所以我们只能乘2,得
2B=a+b(2^-1)
注意a变成了整数部分,我们取整数正好是取到了a,剩下的小数部分也如此。
值得一提的是,小数部分的按权展开的数位顺数正好和整数部分相反,所以不必反向取余数了。

十进制转换二进制python代码
1
2
3
4
5
6
7
8
9
10
11
12def Dec2Bin(dec):
temp = []
result = ''
while dec:
quo = dec % 2
dec = dec // 2
temp.append(quo)
while temp:
result += str(temp.pop())
  
return result
print(Dec2Bin(62))
十进制转二进制 Visual Basic 2015 代码
Private Sub 转换进制(sender As Object, e As EventArgs) Handles btn转换.Click
If str十进制数是否合法(txt十进制数.Text) = "整数" Then
MessageBox.Show(str十进制整数转二进制(txt十进制数.Text))
ElseIf str十进制数是否合法(txt十进制数.Text) = "小数" Then
Dim 整数部分 As Long = CInt(txt十进制数.Text.Substring(0, txt十进制数.Text.IndexOf(".")))
Dim 小数部分 As Double = CDbl(CDbl(txt十进制数.Text) - 整数部分)
MessageBox.Show(str十进制整数转二进制(整数部分) & "." & str十进制小数转二进制(小数部分))
Else
MessageBox.Show("输入数值不合法,请重新输入!")
txt十进制数.SelectAll()
txt十进制数.Focus()
End If
End Sub
Private Function str十进制数是否合法(ByVal str十进制数 As String) As String
If IsNumeric(str十进制数) Then
If str十进制数.Contains(".") Then
Return "小数"
Else
Return "整数"
End If
Else
Return "不是数"
End If
End Function
Private Function str十进制整数转二进制(ByVal lng十进制整数 As Long) As String
Dim lng被除数 As Long = lng十进制整数
Dim str结果 As String
Do
If lng被除数 Mod 2 = 0 Then
str结果 &= "0"
Else
str结果 &= "1"
End If
lng被除数 = lng被除数 \ 2
Loop Until lng被除数 = 0
str结果 = StrReverse(str结果)
Return str结果
End Function
Private Function str十进制小数转二进制(ByVal dbl十进制小数 As Double) As String
Dim dbl被乘数 As Double = dbl十进制小数
Dim str结果 As String
Do
dbl被乘数 *= 2
If dbl被乘数 >= 1 Then
str结果 &= "1"
dbl被乘数 -= 1
Else
str结果 &= "0"
End If
Loop Until dbl被乘数 = 0
Return str结果
End Function
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-23 11:44:27 | 显示全部楼层
黎明§末日 发表于 2017-8-23 11:36
while True:
    dec = input("回车键进入,按Q/q退出:")

输入负整数的时候,还是不行,比如输入:-1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-23 11:47:17 | 显示全部楼层    本楼为最佳答案   
所以不能,希望能帮到您
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-23 11:48:54 | 显示全部楼层
Python的BIF都不支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-23 11:49:27 | 显示全部楼层
我用的是BIF
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 17:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表