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

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
Think1st
帖子: 45
注册时间: 2012-02-07 23:08

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

#1

帖子 Think1st » 2012-02-29 21:39

自己把脚本写的萝莉罗嗦的,不知道各位有没有简洁的方法?
在这里,问题比答案更抢手。
头像
cuihao
帖子: 4793
注册时间: 2008-07-24 11:33
来自: 郑州
联系:

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

#2

帖子 cuihao » 2012-02-29 22:05

使用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位补码。
求人不如求它仨: 天蓝的Wiki 屎黄的Wiki 绿
Site: CUIHAO.TK    Twitter: @cuihaoleo
Machine: Athlon64 X2 5200+ / 2x2GB DDR2-800 / GeForce GTS 450
AD: ~まだ見ぬ誰かの笑顔のために~
头像
Think1st
帖子: 45
注册时间: 2012-02-07 23:08

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

#3

帖子 Think1st » 2012-03-01 11:04

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
在这里,问题比答案更抢手。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

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

#4

帖子 eexpress » 2012-03-01 12:27

补码平时用不上啊。补码的英文单词是啥,去源里面,搜索软件描述,说不定有现成的。
● 鸣学
头像
ChenFengyuan
帖子: 770
注册时间: 2008-03-23 0:39

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

#5

帖子 ChenFengyuan » 2012-03-01 18:43

eexpress 写了:补码平时用不上啊。补码的英文单词是啥,去源里面,搜索软件描述,说不定有现成的。
two's complement
fnan
帖子: 919
注册时间: 2009-07-01 22:04

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

#6

帖子 fnan » 2012-03-01 22:30

[[ $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
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

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

#7

帖子 fnan » 2012-03-02 0:12

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: 求助,如何用脚本算出二进制补码?

#8

帖子 Think1st » 2012-03-07 15:23

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 的方法不错 比我的方法通用性强。
在这里,问题比答案更抢手。
回复