求助,如何用脚本算出二进制补码?
- Think1st
- 帖子: 45
- 注册时间: 2012-02-07 23:08
- cuihao
- 帖子: 4793
- 注册时间: 2008-07-24 11:33
- 来自: 郑州
- 联系:
Re: 求助,如何用脚本算出二进制补码?
使用python作弊:
输出数字X的N位补码。
代码: 全选
cuihao@cuihao-arch /tmp $ echo `python2 -c "print bin(2**8+-20)[-8:]"`
11101100
代码: 全选
echo `python2 -c "print bin(2**$N+$X)[-$N:]"`
求人不如求它仨: 天蓝的Wiki 屎黄的Wiki 蓝红黄蓝绿红
Site: CUIHAO.TK Twitter: @cuihaoleo
Machine: Athlon64 X2 5200+ / 2x2GB DDR2-800 / GeForce GTS 450
AD: ~まだ見ぬ誰かの笑顔のために~
Site: CUIHAO.TK Twitter: @cuihaoleo
Machine: Athlon64 X2 5200+ / 2x2GB DDR2-800 / GeForce GTS 450
AD: ~まだ見ぬ誰かの笑顔のために~
- Think1st
- 帖子: 45
- 注册时间: 2012-02-07 23:08
Re: 求助,如何用脚本算出二进制补码?
恩,python挺好。比如想求 -128~127的8位补码,用bash 的话,用到的脚本
代码: 全选
#!/bin/bash
num=$1
#检查合法性
[[ $num -gt 127 || $num -lt -128 ]] && exit 0 || echo $num
#负数转为256-num
[[ $num -lt 0 ]] && num=$((256+num))
#转为二进制
binum=`echo "ibase=10;obase=2;$num" | bc | xargs printf "%08d\n"`
echo $binum

在这里,问题比答案更抢手。
- eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
- ChenFengyuan
- 帖子: 770
- 注册时间: 2008-03-23 0:39
Re: 求助,如何用脚本算出二进制补码?
two's complementeexpress 写了:补码平时用不上啊。补码的英文单词是啥,去源里面,搜索软件描述,说不定有现成的。
-
- 帖子: 919
- 注册时间: 2009-07-01 22:04
Re: 求助,如何用脚本算出二进制补码?
#这样64位时就产生溢出,PYTHON支持超长数,shell版本只能最多到64位:[[ $num -lt 0 ]] && num=$((256+num))
n=3;b=64;((n>2**(b-1)-1 || n<-(2**(b-1))?1:0)) || while((--b>=0));do printf $((n & (1<<b)?1:0));done;echo
0000000000000000000000000000000000000000000000000000000000000011
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
-
- 帖子: 919
- 注册时间: 2009-07-01 22:04
Re: 求助,如何用脚本算出二进制补码?
n=3;b=128;(($(echo "$n>2^($b-1)-1 || $n<-(2^($b-1))"|bc))) || echo 'obase=2;'$((( $(bc <<<"$n<0"))) && echo $(bc <<<"2^$b+$n") || echo $n)|bc|tr -dc 01|sed -r ":A;/.{$b}/bB;s/^/0/;tA;:B;s/$/\n/"
#近似无限位,应该无需要。
#近似无限位,应该无需要。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
- Think1st
- 帖子: 45
- 注册时间: 2012-02-07 23:08
Re: 求助,如何用脚本算出二进制补码?
用 num1 & num2 的方法不错 比我的方法通用性强。fnan 写了:#这样64位时就产生溢出,PYTHON支持超长数,shell版本只能最多到64位:[[ $num -lt 0 ]] && num=$((256+num))
n=3;b=64;((n>2**(b-1)-1 || n<-(2**(b-1))?1:0)) || while((--b>=0));do printf $((n & (1<<b)?1:0));done;echo
0000000000000000000000000000000000000000000000000000000000000011
在这里,问题比答案更抢手。