[R語言]8位元布斯演算法(Booth’s Algorithm)

用R語言模擬了8位元布斯演算法

流程圖:


CODE:
※從 #####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]))

留言

這個網誌中的熱門文章

[Arduino]電子秤平 重量感測條+HX711AD模組

cpe練習筆記 UVa401 Palindromes

cpe練習筆記 UVa10019 Funny Encryption Method