JS模擬實(shí)現(xiàn)串行加法器
在重溫《編碼:隱匿在計(jì)算機(jī)軟硬件背后的語(yǔ)言》第12章——二進(jìn)制加法器時(shí),心血來(lái)潮用JS寫了一個(gè)模擬串行加法器。
測(cè)試斷言工具TestUtils.js
function assertTrue(actual){
? ? if(!actual)
? ? ? ? throw "Error actual: " + actual + " is not true."
}
function assertFalse(actual){
? ? if(actual)
? ? ? ? throw "Error actual: " + actual + " is not false."
}
function assertIntEquals(expected, actual){
? ? if(typeof expected != "number")
? ? ? ? throw "Error expected: " + expected +" is not a number."
? ? if(typeof actual != "number")
? ? ? ? throw "Error actual: " + actual +" is not a number."
? ? if(expected != actual)
? ? ? ? throw "Error expected: " + expected + " and actual: " + actual +" is different."
}十進(jìn)制數(shù)與二進(jìn)制數(shù)之間轉(zhuǎn)換工具utils.js
function int2LowEightBitArray(num){
? ? var result = []
? ? for(var i = 0; i < 8; i++)
? ? ? ? result.push(((num >> i) & 1) == 1)
? ? return result
}
function lowEightBitArray2Int(array){
? ? var result = 0
? ? for(var i = 0; i < 8; i++){
? ? ? ? if(array[i])
? ? ? ? ? ? result += (1 << i)
? ? }
? ? return result
}
function lowNineBitArray2Int(array){
? ? var result = 0
? ? for(var i = 0; i < 9; i++){
? ? ? ? if(array[i])
? ? ? ? ? ? result += (1 << i)
? ? }
? ? return result
}
//用補(bǔ)碼表示負(fù)數(shù)
function int2EightBitArray(num){
? ? if(num < -128 || num > 127){
? ? ? ? throw "Out of boundary(-128, 127)."
? ? }
? ? var result = []
? ? for(var i = 0; i < 8; i++)
? ? ? ? result.push(((num >> i) & 1) == 1)
? ? return result
}
function eightBitArray2Int(array){
? ? var result = 0
? ? for(var i = 0; i < 7; i++){
? ? ? ? if(array[i])
? ? ? ? ? ? result += (1 << i)
? ? }
? ? if(array[i])
? ? ? ? result += -128
? ? return result
}
function int2SixteenBitArray(num){
? ? if(num < -(1 << 15) || num > (1 << 15) - 1){
? ? ? ? throw "Out of boundary({left}, {right})."
? ? ? ? ? ? .replace("{left}", -(1 << 15))
? ? ? ? ? ? .replace("{right}", (1 << 15) - 1)
? ? }
? ? var result = []
? ? for(var i = 0; i < 16; i++)
? ? ? ? result.push(((num >> i) & 1) == 1)
? ? return result
}
function sixteentBitArray2Int(array){
? ? var result = 0
? ? for(var i = 0; i < 15; i++){
? ? ? ? if(array[i])
? ? ? ? ? ? result += (1 << i)
? ? }
? ? if(array[i])
? ? ? ? result += -(1 << 15)
? ? return result
}加法器模型model.js
class DoubleInGate{
? ? #id
? ? #in1
? ? #in2
? ? #gateTypeName
? ? #func
? ? #out
? ? #lastOut
? ? #outReceiver
? ? #outReceiverInName
? ? constructor(id, gateTypeName, in1 = false, in2 = false, func){
? ? ? ? this.#id = id
? ? ? ? this.#gateTypeName = gateTypeName
? ? ? ? this.#in1 = in1
? ? ? ? this.#in2 = in2
? ? ? ? this.#func = func
? ? ? ? this.#out = this.#func(this.in1, this.in2)
? ? ? ? // this.#lastOut = this.#out
? ? }
? ??
? ? updateIn1(flag){
? ? ? ? this.#in1 = flag
? ? ? ? this.#updateOut()
? ? }
? ??
? ? updateIn2(flag){
? ? ? ? this.#in2 = flag
? ? ? ? this.#updateOut()
? ? }
? ??
? ? getOut(){
? ? ? ? return this.#out;
? ? }
? ? updateBothIn(in1 = false, in2 = false){
? ? ? ? this.#in1 = in1
? ? ? ? this.#in2 = in2
? ? ? ? this.#updateOut()
? ? }
? ??
? ? setOutReceiver(outReceiver, inName){
? ? ? ? this.#outReceiver = outReceiver
? ? ? ? this.#outReceiverInName = inName
? ? }
? ? #updateOut(){
? ? ? ? this.#lastOut = this.#out
? ? ? ? this.#out = this.#func(this.#in1, this.#in2)
? ? ? ? if(this.#out != this.#lastOut){
? ? ? ? ? ? this.#send(this.#out)
? ? ? ? }
? ? }
? ? #send(flag){
? ? ? ? if(this.#outReceiver){
? ? ? ? ? ? this.#outReceiver.receive(this.#outReceiverInName, flag)
? ? ? ? }
? ? }
? ? receive(inName, flag){
? ? ? ? if(inName == "in1"){
? ? ? ? ? ? this.updateIn1(flag)
? ? ? ? }else if(inName == "in2"){
? ? ? ? ? ? this.updateIn2(flag)
? ? ? ? }
? ? }
? ? toString(){
? ? ? ? return "{gateTypeName} id: {id}, in1: {in1}, in2: {in2}, out:{out}"
? ? ? ? ? ? .replace("{gateTypeName}", this.#gateTypeName)
? ? ? ? ? ? .replace("{id}", this.#id)
? ? ? ? ? ? .replace("{in1}", this.#in1)
? ? ? ? ? ? .replace("{in2}", this.#in2)
? ? ? ? ? ? .replace("{out}", this.#out)
? ? }
}
//與門
class AndGate extends DoubleInGate{
? ? constructor(id, in1 = false, in2 = false){
? ? ? ? super(id, "AndGate", in1, in2, (i1, i2) => i1 && i2)
? ? }
}
//或門
class OrGate extends DoubleInGate{
? ? constructor(id, in1 = false, in2 = false){
? ? ? ? super(id, "OrGate", in1, in2, (i1, i2) => i1 || i2)
? ? }
}
//異或門
class XorGate extends DoubleInGate{
? ? constructor(id, in1 = false, in2 = false){
? ? ? ? //^在js按位異或, 而在java中不是
? ? ? ? super(id, "XorGate", in1, in2, (i1, i2) => (i1 || i2) && !(i1 && i2))?
? ? }
}
class SingleInGate{
? ? #id
? ? #in
? ? #out
? ? #lastOut
? ? #func
? ? #outReceiver
? ? #outReceiverInName
? ? constructor(id, in_, func){
? ? ? ? this.#id = id
? ? ? ? this.#in = in_
? ? ? ? this.#func = func
? ? ? ? this.#out = this.#func(this.#in)
? ? ? ? // this.#lastOut = this.#out
? ? }
? ? updateIn(flag){
? ? ? ? this.#in = flag
? ? ? ? this.#updateOut()
? ? }
? ? getOut(){
? ? ? ? return this.#out
? ? }
? ? //注冊(cè)輸出端口接收者,(類觀察者模式)
? ? setOutReceiver(outReceiver, inName){
? ? ? ? this.#outReceiver = outReceiver
? ? ? ? this.#outReceiverInName = inName
? ? }
? ? #updateOut(){
? ? ? ? this.#lastOut = this.#out
? ? ? ? this.#out = this.#func(this.#in)
? ? ? ? if(this.#out != this.#lastOut){
? ? ? ? ? ? this.#send(this.#out)
? ? ? ? }
? ? }
? ? #send(flag){
? ? ? ? if(this.#outReceiver){
? ? ? ? ? ? this.#outReceiver.receive(this.#outReceiverInName, flag)
? ? ? ? } ? ?
? ? }
? ? receive(inName, flag){
? ? ? ? if(inName == "in"){ //TODO 或許有更靈活的寫法
? ? ? ? ? ? this.updateIn(flag)
? ? ? ? }
? ? }
}
class NullGate extends SingleInGate{
? ? constructor(id, in_= false){
? ? ? ? super(id, in_, a=>a)
? ? }
}
class NotGate extends SingleInGate{
? ? constructor(id, in_= false){
? ? ? ? super(id, in_, a=>!a)
? ? }
}
class Adder{
? ? #id
? ? #inA
? ? #inB
? ??
? ? #outS
? ? #outC
? ? #lastOutS
? ? #lastOutC
? ? #outSReceiver
? ? #outSReceiverInName
? ? #outCReceiver
? ? #outCReceiverInName
? ? constructor(id, inA=false, inB=false, outS, outC){
? ? ? ? this.#id = id
? ? ? ? this.#inA = inA
? ? ? ? this.#inB = inB
? ? ? ? this.#outS = outS
? ? ? ? this.#outC = outC
? ? }
? ? updateInA(flag, func){
? ? ? ? this.#inA = flag
? ? ? ? this.updateOutSAndOutC(func)
? ? }
? ? updateInB(flag, func){
? ? ? ? this.#inB = flag
? ? ? ? this.updateOutSAndOutC(func)
? ? }
? ? updateBothIn(inA, inB, func){
? ? ? ? this.#inA = inA
? ? ? ? this.#inB = inB
? ? ? ? this.updateOutSAndOutC(func)
? ? }
? ? getOutS(){
? ? ? ? return this.#outS
? ? }
? ? getOutC(){
? ? ? ? return this.#outC
? ? }
? ? #updateOutS(flag){
? ? ? ? this.#lastOutS = this.#outS
? ? ? ? this.#outS = flag
? ? ? ? if(this.#outS != this.#lastOutS){
? ? ? ? ? ? this.#sendOutS(this.#outS)
? ? ? ? }
? ? }
? ??
? ? #updateOutC(flag){
? ? ? ? this.#lastOutC = this.#outC
? ? ? ? this.#outC = flag
? ? ? ? if(this.#outC != this.#lastOutC){
? ? ? ? ? ? this.#sendOutC(this.#outC)
? ? ? ? }
? ? }
? ??
? ? updateOutSAndOutC(func){
? ? ? ? if(func){
? ? ? ? ? ? var results = func()
? ? ? ? ? ? this.#updateOutS(results[0])
? ? ? ? ? ? this.#updateOutC(results[1])
? ? ? ? }
? ? }
? ? setOutSReceiver(outSReceiver, inName){
? ? ? ? this.#outSReceiver = outSReceiver
? ? ? ? this.#outSReceiverInName = inName
? ? }
? ? setOutCReceiver(outCReceiver, inName){
? ? ? ? this.#outCReceiver = outCReceiver
? ? ? ? this.#outCReceiverInName = inName
? ? }
? ? receive(inName, flag){
? ? ? ? if(inName == "inA"){
? ? ? ? ? ? this.updateInA(flag)
? ? ? ? }else if(inName == "inB"){
? ? ? ? ? ? this.updateInB(flag)
? ? ? ? }
? ? }
? ? #sendOutS(flag){
? ? ? ? if(this.#outSReceiver){
? ? ? ? ? ? this.#outSReceiver.receive(this.#outSReceiverInName, flag)
? ? ? ? }
? ? }
? ? #sendOutC(flag){
? ? ? ? if(this.#outCReceiver){
? ? ? ? ? ? this.#outCReceiver.receive(this.#outCReceiverInName, flag)
? ? ? ? }
? ? }
}
class HalfAdder extends Adder{
? ? #xorGate
? ? #andGate
? ? constructor(id, inA=false, inB=false){
? ? ? ? var xorGate = new XorGate(undefined, inA, inB);
? ? ? ? var andGate = new AndGate(undefined, inA, inB);
? ? ? ? super(id, inA, inB, xorGate.getOut(), andGate.getOut())
? ? ? ? this.#xorGate = xorGate
? ? ? ? this.#andGate = andGate?
? ? }
? ? #returnOutArray(){
? ? ? ? return [this.#xorGate.getOut(), this.#andGate.getOut()]
? ? }
? ? updateInA(flag){
? ? ? ? super.updateInA(flag, ()=>{
? ? ? ? ? ? this.#xorGate.updateIn1(flag)
? ? ? ? ? ? this.#andGate.updateIn1(flag)
? ? ? ? ? ? return this.#returnOutArray()
? ? ? ? })
? ? }
? ? updateInB(flag){
? ? ? ? super.updateInB(flag, ()=>{
? ? ? ? ? ? this.#xorGate.updateIn2(flag)
? ? ? ? ? ? this.#andGate.updateIn2(flag)
? ? ? ? ? ? return this.#returnOutArray()
? ? ? ? })
? ? }
? ? updateBothIn(inA, inB){
? ? ? ? super.updateBothIn(inA, inB, ()=>{
? ? ? ? ? ? this.#xorGate.updateBothIn(inA, inB)
? ? ? ? ? ? this.#andGate.updateBothIn(inA, inB)
? ? ? ? ? ? return this.#returnOutArray()
? ? ? ? })
? ? }
}
class FullAdder extends Adder{
? ? #inC
? ? #halfAdder1
? ? #halfAdder2
? ? #orGate
? ? constructor(id, inA = false, inB = false, inC = false){
? ? ? ? var halfAdder1 = new HalfAdder(undefined, inA, inB)
? ? ? ? var halfAdder2 = new HalfAdder(undefined, inC, halfAdder1.getOutS())
? ? ? ? var orGate = new OrGate(undefined, halfAdder1.getOutC(), halfAdder2.getOutC())
? ? ? ? super(id, inA, inB, halfAdder2.getOutS(), orGate.getOut())
? ? ? ? this.#inC = inC
? ? ? ? this.#halfAdder1 = halfAdder1
? ? ? ? this.#halfAdder2 = halfAdder2
? ? ? ? this.#orGate = orGate
? ? ? ? this.#halfAdder1.setOutSReceiver(halfAdder2, "inB")
? ? ? ? this.#halfAdder1.setOutCReceiver(orGate, "in1")
? ? ? ? this.#halfAdder2.setOutCReceiver(orGate, "in2")
? ? }
? ? #returnOutArray(){
? ? ? ? return [this.#halfAdder2.getOutS(), this.#orGate.getOut()]
? ? }
? ? updateInA(flag){
? ? ? ? super.updateInA(flag, ()=>{
? ? ? ? ? ? this.#halfAdder1.updateInA(flag)
? ? ? ? ? ? return this.#returnOutArray()
? ? ? ? })
? ? }
? ? updateInB(flag){
? ? ? ? super.updateInB(flag, ()=>{
? ? ? ? ? ? this.#halfAdder1.updateInB(flag)
? ? ? ? ? ? return this.#returnOutArray()
? ? ? ? })
? ? }
? ? updateInC(flag){
? ? ? ? this.#inC = flag
? ? ? ? this.#halfAdder2.updateInA(flag)
? ? ? ? this.updateOutSAndOutC(()=>{
? ? ? ? ? ? return this.#returnOutArray()
? ? ? ? })
? ? }
? ? updateBothIn(inA, inB){
? ? ? ? super.updateBothIn(inA, inB, ()=>{
? ? ? ? ? ? this.#halfAdder1.updateBothIn(inA, inB)
? ? ? ? ? ? return this.#returnOutArray()
? ? ? ? })
? ? }
? ? updateThreeIn(inA, inB, inC){
? ? ? ? super.updateBothIn(inA, inB)
? ? ? ? this.#inC = inC
? ? ? ? this.#halfAdder1.updateBothIn(inA, inB)
? ? ? ? this.#halfAdder2.updateBothIn(inC, this.#halfAdder1.getOutS())
? ? ? ? this.#orGate.updateBothIn(this.#halfAdder1.getOutC(), this.#halfAdder2.getOutC())
? ? ? ? this.updateOutSAndOutC(()=>{
? ? ? ? ? ? return this.#returnOutArray()
? ? ? ? })
? ? }
? ? receive(inName, flag){
? ? ? ? super.receive(inName, flag)
? ? ? ? if(inName == "inC"){
? ? ? ? ? ? this.updateInC(flag)
? ? ? ? }
? ? }
}
class EightBitBinaryAdder{
? ? #inC
? ? #outC
? ? #lastOutC
? ? #inA
? ? #inB
? ? #outS
? ? #fullAdders
? ? #fullAdderNum
? ? #outCReceiver
? ? #outCReceiverInName
? ? #outCInOutSFlag
? ? constructor(outCInOutSFlag = false){
? ? ? ? this.#outCInOutSFlag = outCInOutSFlag
? ? ? ? this.#inC = false
? ? ? ? this.#fullAdderNum = 8
? ? ? ? this.#fullAdders = []
? ? ? ? this.#inA = []
? ? ? ? this.#inB = []
? ? ? ? for(var i = 0; i < this.#fullAdderNum; i++){
? ? ? ? ? ? this.#inA.push(false)
? ? ? ? ? ? this.#inB.push(false)
? ? ? ? }
? ? ? ? //新鍵8個(gè)全加器
? ? ? ? for(var i = 0; i < this.#fullAdderNum; i++){
? ? ? ? ? ? this.#fullAdders.push(new FullAdder("f" + i))
? ? ? ? ? ? if(i != 0){
? ? ? ? ? ? ? ? this.#fullAdders[i - 1].setOutCReceiver(this.#fullAdders[i], "inC")
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? this.updateOut()
? ? }
? ? updateBothIn(arrayA, arrayB){
? ? ? ? // this.#inC = inC
? ? ? ? this.#inA = arrayA
? ? ? ? this.#inB = arrayB
? ? ? ? for(var i = 0; i < this.#fullAdderNum; i++){
? ? ? ? ? ? if(i == 0){
? ? ? ? ? ? ? ? this.#fullAdders[i].updateInC(this.#inC)
? ? ? ? ? ? }
? ? ? ? ? ? this.#fullAdders[i].updateBothIn(arrayA[i], arrayB[i])
? ? ? ? }
? ? ? ? this.updateOut()
? ? }
? ? //輸出默認(rèn)值
? ? updateOut(){
? ? ? ? this.#outS = []
? ? ? ? for(var i = 0; i < this.#fullAdderNum; i++){
? ? ? ? ? ? this.#outS.push(this.#fullAdders[i].getOutS())
? ? ? ? ? ? if(i == this.#fullAdderNum - 1){
? ? ? ? ? ? ? ? this.#lastOutC = this.#outC
? ? ? ? ? ? ? ? this.#outC = this.#fullAdders[i].getOutC()
? ? ? ? ? ? ? ? if(this.#lastOutC != this.#outC)
? ? ? ? ? ? ? ? ? ? this.#sendOutC(this.#outC)
? ? ? ? ? ? ? ? if(this.#outCInOutSFlag)
? ? ? ? ? ? ? ? ? ? this.#outS.push(this.#outC)
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? updateInC(flag){
? ? ? ? this.#inC = flag
? ? ? ? this.updateBothIn(this.#inA, this.#inB, flag)
? ? }
? ? receive(inName, flag){
? ? ? ? if(inName == "inC"){
? ? ? ? ? ? this.updateInC(flag)
? ? ? ? }
? ? }
? ? #sendOutC(flag){
? ? ? ? if(this.#outCReceiver){
? ? ? ? ? ? this.#outCReceiver.receive(this.#outCReceiverInName, flag)
? ? ? ? }
? ? }
? ? setOutCReceiver(outCReceiver, inName){
? ? ? ? this.#outCReceiver = outCReceiver
? ? ? ? this.#outCReceiverInName = inName
? ? }
? ? getOut(){
? ? ? ? return this.#outS
? ? }
}
class SixteenBitBinaryAdder{
? ? #inC
? ? #outC
? ? #lastOutC
? ? #inA
? ? #inB
? ? #outS
? ? #eightBitBinaryAdder1
? ? #eightBitBinaryAdder2
? ? #bitNum = 16
? ? #outCReceiver
? ? #outCReceiverInName
? ? #outCInOutSFlag
? ? constructor(outCInOutSFlag){
? ? ? ? this.#outCInOutSFlag = outCInOutSFlag
? ? ? ? this.#inC = false
? ? ? ? this.#eightBitBinaryAdder1 = new EightBitBinaryAdder()
? ? ? ? this.#eightBitBinaryAdder2 = new EightBitBinaryAdder()
? ? ? ? this.#inA = []
? ? ? ? this.#inB = []
? ? ? ? for(var i = 0; i < this.#bitNum; i++){
? ? ? ? ? ? this.#inA.push(false)
? ? ? ? ? ? this.#inB.push(false)
? ? ? ? }
? ? ? ? this.#eightBitBinaryAdder1.setOutCReceiver(this.#eightBitBinaryAdder2, "inC")
? ? ? ? this.updateOut()
? ? }
? ? updateBothIn(arrayA, arrayB){
? ? ? ? this.#inA = arrayA
? ? ? ? this.#inB = arrayB
? ? ? ? this.#eightBitBinaryAdder1.updateBothIn(arrayA.slice(0, 8), arrayB.slice(0, 8))
? ? ? ? this.#eightBitBinaryAdder2.updateBothIn(arrayA.slice(8), arrayB.slice(8))
? ? ? ? this.updateOut()
? ? }
? ? updateOut(){
? ? ? ? this.#outS = this.#eightBitBinaryAdder1.getOut().concat(this.#eightBitBinaryAdder2.getOut())
? ? ? ? //發(fā)送send(OutC)
? ? }
? ? getOut(){
? ? ? ? return this.#outS
? ? }
? ? //TODO
? ? // updateInC(flag){
? ? // ? ? this.#inC = flag
? ? // ? ? this.updateBothIn(this.#inA, this.#inB, flag)
? ? // }
? ? // receive(inName, flag){
? ? // ? ? if(inName == "inC"){
? ? // ? ? ? ? this.updateInC(flag)
? ? // ? ? }
? ? // }
? ? #sendOutC(flag){
? ? ? ? if(this.#outCReceiver){
? ? ? ? ? ? this.#outCReceiver.receive(this.#outCReceiverInName, flag)
? ? ? ? }
? ? }
? ? setOutCReceiver(outCReceiver, inName){
? ? ? ? this.#outCReceiver = outCReceiver
? ? ? ? this.#outCReceiverInName = inName
? ? }
}運(yùn)行驗(yàn)證代碼testModel.js
驗(yàn)證通過(guò)判據(jù):后臺(tái)沒(méi)有打印輸出異常。
<!DOCTYPE html>
<html lang="en">
<head>
? ? <meta charset="UTF-8">
? ? <meta http-equiv="X-UA-Compatible" content="IE=edge">
? ? <meta name="viewport" content="width=device-width, initial-scale=1.0">
? ? <title>Test</title>
? ? <script src="../js/test/TestUtils.js"></script>
? ? <script src="../js/model.js"></script>
? ? <script src="../js/utils.js"></script>
</head>
<body>
? ? <script>
? ? ? ? var g1 = new NullGate("g1")
? ? ? ? var g2 = new NullGate("g2")
? ? ? ? var g3 = new NullGate("g3")
? ? ? ? var g4 = new NullGate("g4")
? ? ? ? var g5 = new NullGate("g5")
? ? ? ? var g6 = new NullGate("g6")
? ? ? ? g1.setOutReceiver(g2, "in")
? ? ? ? g2.setOutReceiver(g3, "in")
? ? ? ? g3.setOutReceiver(g4, "in")
? ? ? ? g4.setOutReceiver(g5, "in")
? ? ? ? g5.setOutReceiver(g6, "in")
? ? ? ? g1.updateIn(true)
? ? ? ? assertTrue(g6.getOut())
? ? </script>
? ? <script>
? ? ? ? //與門
? ? ? ? var andGate = new AndGate("a01")
? ? ? ? assertFalse(andGate.getOut())
? ? ? ? andGate.updateIn1(true)
? ? ? ? assertFalse(andGate.getOut())
? ? ? ? andGate.updateIn2(true)
? ? ? ? assertTrue(andGate.getOut())
? ? ? ? //或門
? ? ? ? var orGate = new OrGate("o01")
? ? ? ? assertFalse(orGate.getOut())
? ? ? ? orGate.updateIn1(true)
? ? ? ? assertTrue(orGate.getOut())
? ? ? ? orGate.updateIn2(true)
? ? ? ? assertTrue(orGate.getOut())
? ? ? ? //異或門
? ? ? ? var xorGate = new XorGate("x01")
? ? ? ? assertFalse(xorGate.getOut())
? ? ? ? xorGate.updateIn1(true)
? ? ? ? assertTrue(xorGate.getOut())
? ? ? ? xorGate.updateIn2(true)
? ? ? ? assertFalse(xorGate.getOut())
? ? ? ? xorGate.updateBothIn(false, true)
? ? ? ? assertTrue(xorGate.getOut())
? ? </script>
? ? <script>
? ? ? ? //半加器
? ? ? ? var ha = new HalfAdder("h01")
? ? ? ? assertFalse(ha.getOutS())
? ? ? ? assertFalse(ha.getOutC())
? ? ? ??
? ? ? ? ha.updateInB(true)
? ? ? ? assertTrue(ha.getOutS())
? ? ? ? assertFalse(ha.getOutC())
? ? ? ? ha.updateInA(true)
? ? ? ? assertFalse(ha.getOutS())
? ? ? ? assertTrue(ha.getOutC())
? ? ? ? ha.updateBothIn(true, false)
? ? ? ? assertTrue(ha.getOutS())
? ? ? ? assertFalse(ha.getOutC())
? ? </script>
? ? <script>
? ? ? ? //全加器
? ? ? ? var fa = new FullAdder("fa01")
? ? ? ? assertFalse(fa.getOutC())
? ? ? ? assertFalse(fa.getOutS())
? ? ? ? function test(inA, inB, inC, expectedS, expectedC){
? ? ? ? ? ? fa.updateThreeIn(inA, inB, inC)
? ? ? ? ? ? if(expectedS)
? ? ? ? ? ? ? ? assertTrue(fa.getOutS())
? ? ? ? ? ? else
? ? ? ? ? ? ? ? assertFalse(fa.getOutS())
? ? ? ? ? ? if(expectedC)
? ? ? ? ? ? ? ? assertTrue(fa.getOutC())
? ? ? ? ? ? else
? ? ? ? ? ? ? ? assertFalse(fa.getOutC())
? ? ? ? }
? ? ? ? test(false, false, false, false, false)
? ? ? ? test(false, true, false, true, false)
? ? ? ? test(true, false, false, true, false)
? ? ? ? test(true, true, false, false, true)
? ? ? ? test(false, false, true, true, false)
? ? ? ? test(false, true, true, false, true)
? ? ? ? test(true, false, true, false, true)
? ? ? ? test(true, true, true, true, true)
? ? ? ??
? ? </script>
? ? <script>
? ? ? ? for(var i = 0 ; i < 256; i++){
? ? ? ? ? ? assertIntEquals(i, lowEightBitArray2Int(int2LowEightBitArray(i)))
? ? ? ? }
? ? </script>
? ? <script>
? ? ? ? var ebba = new EightBitBinaryAdder(true)
? ? ? ? for(var i = 0; i < 256; i++){
? ? ? ? ? ? for(var j = 0; j < 256; j++){i
? ? ? ? ? ? ? ? ebba.updateBothIn(int2LowEightBitArray(i), int2LowEightBitArray(j))
? ? ? ? ? ? ? ? assertIntEquals(i + j, lowNineBitArray2Int(ebba.getOut()))
? ? ? ? ? ? }
? ? ? ? }
? ? </script>
? ? <script>
? ? ? ? for(var i = -128; i <= 127; i++){
? ? ? ? ? ? assertIntEquals(i, eightBitArray2Int(int2EightBitArray(i)))
? ? ? ? }
? ? </script>
? ? <script>
? ? ? ? var ebba = new EightBitBinaryAdder()
? ? ? ? for(var i = -64; i < 64; i++){
? ? ? ? ? ? for(var j = -64; j < 64; j++){
? ? ? ? ? ? ? ? ebba.updateBothIn(int2EightBitArray(i), int2EightBitArray(j))
? ? ? ? ? ? ? ? assertIntEquals(i + j, eightBitArray2Int(ebba.getOut()))
? ? ? ? ? ? }
? ? ? ? }
? ? </script>
? ? <script>
? ? ? ? for(var i = -(1<<15); i <= (1<<15) - 1; i++){
? ? ? ? ? ? assertIntEquals(i, sixteentBitArray2Int(int2SixteenBitArray(i)))
? ? ? ? }
? ? </script>
? ? <script>
? ? ? ? var sbba = new SixteenBitBinaryAdder()
? ? ? ? sbba.updateBothIn(int2SixteenBitArray(1156), int2SixteenBitArray(9999))
? ? ? ? assertIntEquals(9999 + 1156, sixteentBitArray2Int(sbba.getOut()))
? ? ? ? //?16384? * ?16384? = 268435456 如果這樣算會(huì)十分耗時(shí)
? ? ? ? // for(var i = -(1<<14); i < (1<<14); i++){
? ? ? ? // ? ? for(var j = -(1<<14); j < (1<<14); j++){
? ? ? ? // ? ? ? ? sbba.updateBothIn(int2SixteenBitArray(i), int2SixteenBitArray(j))
? ? ? ? // ? ? ? ? assertIntEquals(i + j, sixteentBitArray2Int(sbba.getOut()))
? ? ? ? // ? ? }
? ? ? ? // }
? ? ? ? for(var i = -100; i < 100; i++){
? ? ? ? ? ? for(var j = -100; j < 100; j++){
? ? ? ? ? ? ? ? sbba.updateBothIn(int2SixteenBitArray(i), int2SixteenBitArray(j))
? ? ? ? ? ? ? ? assertIntEquals(i + j, sixteentBitArray2Int(sbba.getOut()))
? ? ? ? ? ? }
? ? ? ? }
? ? </script>
</body>
</html>以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Javascript和Java獲取各種form表單信息的簡(jiǎn)單實(shí)例
本篇文章主要是對(duì)Javascript和Java獲取各種form表單信息的簡(jiǎn)單實(shí)例進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-02-02
js實(shí)現(xiàn)千分符和保留幾位小數(shù)的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇js實(shí)現(xiàn)千分符和保留幾位小數(shù)的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08
iframe子頁(yè)面與父頁(yè)面在同域或不同域下的js通信
根據(jù)iframe中src屬性是同域鏈接還是跨域鏈接,通信方式也不同,下面有個(gè)不錯(cuò)的示例,需要的朋友可以參考下2014-05-05
Javascript中Microtask和Macrotask鮮為人知的知識(shí)點(diǎn)
這篇文章主要為大家介紹了Javascript中Microtask和Macrotask鮮為人知的知識(shí)點(diǎn)講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
解析如何利用iframe標(biāo)簽以及js制作時(shí)鐘
本文對(duì)如何利用iframe標(biāo)簽以及js制作時(shí)鐘進(jìn)行了全面解析,分步說(shuō)明,條理清晰,感興趣的朋友可以看下2016-12-12

