[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]))
留言
張貼留言