分页: 1 / 1

求助,如何用脚本算出二进制补码?

发表于 : 2012-02-29 21:39
Think1st
自己把脚本写的萝莉罗嗦的,不知道各位有没有简洁的方法?

Re: 求助,如何用脚本算出二进制补码?

发表于 : 2012-02-29 22:05
cuihao
使用python作弊:

代码: 全选

cuihao@cuihao-arch /tmp $ echo `python2 -c "print bin(2**8+-20)[-8:]"`
11101100

代码: 全选

echo `python2 -c "print bin(2**$N+$X)[-$N:]"`
输出数字X的N位补码。

Re: 求助,如何用脚本算出二进制补码?

发表于 : 2012-03-01 11:04
Think1st
cuihao 写了:使用python作弊:

代码: 全选

cuihao@cuihao-arch /tmp $ echo `python2 -c "print bin(2**8+-20)[-8:]"`
11101100

代码: 全选

echo `python2 -c "print bin(2**$N+$X)[-$N:]"`
输出数字X的N位补码。
恩,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
稍微嫌罗嗦。。有没有优雅一点的方法。。 :em20

Re: 求助,如何用脚本算出二进制补码?

发表于 : 2012-03-01 12:27
eexpress
补码平时用不上啊。补码的英文单词是啥,去源里面,搜索软件描述,说不定有现成的。

Re: 求助,如何用脚本算出二进制补码?

发表于 : 2012-03-01 18:43
ChenFengyuan
eexpress 写了:补码平时用不上啊。补码的英文单词是啥,去源里面,搜索软件描述,说不定有现成的。
two's complement

Re: 求助,如何用脚本算出二进制补码?

发表于 : 2012-03-01 22:30
fnan
[[ $num -lt 0 ]] && num=$((256+num))
#这样64位时就产生溢出,PYTHON支持超长数,shell版本只能最多到64位:
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

Re: 求助,如何用脚本算出二进制补码?

发表于 : 2012-03-02 0:12
fnan
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/"
#近似无限位,应该无需要。

Re: 求助,如何用脚本算出二进制补码?

发表于 : 2012-03-07 15:23
Think1st
fnan 写了:
[[ $num -lt 0 ]] && num=$((256+num))
#这样64位时就产生溢出,PYTHON支持超长数,shell版本只能最多到64位:
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
用 num1 & num2 的方法不错 比我的方法通用性强。