[R語言]8位元布斯演算法(Booth’s Algorithm)
用R語言模擬了8位元布斯演算法
流程圖:
※從 #####code start 開始看,前面都是function...而且寫得有點糟糕= =
#####init
rm(list = ls())
#####function
#plus function
plusBin8<-function(a,b){
if(a[1]==1){
a=not_to2complement8(a)
a=as.numeric(bitsToInt(a))
a=-a
}
else{
a=as.numeric(bitsToInt(a))
}
if(b[1]==1){
b=not_to2complement8(b)
b=as.numeric(bitsToInt(b))
b=-b
}
else{
b=as.numeric(bitsToInt(b))
}
#轉2進制
ans=number2binary((a+b),8)
return(ans)
}
bitsToInt<-function(x) {
packBits(rev(c(rep(FALSE, 32-length(x)%%32), as.logical(x))), "integer")
}
#減???
minusBin8<-function(bigone,smallone){
#轉10進制
bigone=as.numeric(bitsToInt(bigone))
#轉10進制
smallone=as.numeric(bitsToInt(smallone))
#轉2進制
ans=number2binary((bigone-smallone),8)
return(ans)
}
number2binary = function(number, noBits) {
binary_vector = rev(as.numeric(intToBits(number)))
if(missing(noBits)) {
return(binary_vector)
} else {
binary_vector[-(1:(length(binary_vector) - noBits))]
}
}
#8右位移,然後填?
shifting8<-function(a,insertNum){
b=a
a[8]=b[7]
a[7]=b[6]
a[6]=b[5]
a[5]=b[4]
a[4]=b[3]
a[3]=b[2]
a[2]=b[1]
a[1]=insertNum
return(a)
}
#9右位移,然後填?
shifting9<-function(a,insertNum){
b=a
a[9]=b[8]
a[8]=b[7]
a[7]=b[6]
a[6]=b[5]
a[5]=b[4]
a[4]=b[3]
a[3]=b[2]
a[2]=b[1]
a[1]=insertNum
return(a)
}
#做二的補數
to2complement8<-function(a){
for(i in 1:8){
if(a[i]==1){
a[i]=0
}
else if(a[i]==0){
a[i]=1
}
}
b=c(0,0,0,0,0,0,0,1)
plusBin8(a,b)
return(a)
}
#反向二的補數
not_to2complement8<-function(a){
b=c(0,0,0,0,0,0,0,1)
a=minusBin8(a,b)
for(i in 1:8){
if(a[i]==1){
a[i]=0
}
else if(a[i]==0){
a[i]=1
}
}
return(a)
}
#####code start
A=c(0,0,0,0,0,0,0,0)
Q=c(0,0,0,0,0,0,1,1,0) #Q=[1:8] Q-1=Q[9]
M=c(0,0,0,0,0,1,1,1)
insertNum=0
print("M:")
print(M)
print("formate:")
print("A[1:8] Q[9:16] Q-1[17]")
#8位元做8次
for (i in 1:8){
print(i)
if(Q[8]==0 & Q[9]==0){
#no action
}
else if(Q[8]==1 & Q[9]==1){
#no action
}
else if(Q[8]==1 & Q[9]==0){
#減去被乘數
insertNum=1 #補進來的數字
A=minusBin8(A,M)
print(c(A,Q))
}
else if(Q[8]==0 & Q[9]==1){
#加上被乘數
insertNum=0 #補進來的數字
A=plusBin8(A,M)
print(c(A,Q))
}
#位移
Q=shifting9(Q,A[8])
A=shifting8(A,insertNum)
print(c(A,Q))
}
print("ANS")
print(c(A,Q[1:8]))

留言
張貼留言