最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

【TIS-100 攻略】第 13 關(guān):乘法器

2022-10-25 14:31 作者:ココアお姉ちゃん  | 我要投稿

本文首發(fā)于 B 站《TIS-100》文集(https://www.bilibili.com/read/readlist/rl626023)。原創(chuàng)不易,轉(zhuǎn)載請(qǐng)注明出處。

第 13 關(guān)《乘法器》(Signal Multiplier)關(guān)卡展示

本關(guān)要求向 OUT 口輸出 IN.A 乘以 IN.B 的值。

根據(jù)乘法定義,A x B = A + A + ... + A,共 B 個(gè) A 相加?;蛘?B + B + ... + B,共 A 個(gè) B 相加也行。我們可以借用第 5 關(guān)《信號(hào)疊加器》的思想,讓一個(gè)節(jié)點(diǎn)向最終輸出節(jié)點(diǎn)傳 A 次 B,輸出節(jié)點(diǎn)首先初始化為 -999 的偏置量,然后將這么多次 B 的值累加起來(lái)。當(dāng)上方的節(jié)點(diǎn)傳完 A?次 B 后再突然傳個(gè) 999,讓輸出節(jié)點(diǎn)發(fā)現(xiàn)自己的累加器變成了 0 或正數(shù),這樣輸出節(jié)點(diǎn)就得到了沒(méi)有偏置量的正確結(jié)果。代碼如下:

左上角的節(jié)點(diǎn)把 IN.A 的值匯總到右邊(mov up right)。

右上角的節(jié)點(diǎn)先將 IN.B 的值放入 bak 中(mov up acc, swp),再?gòu)淖筮吔邮?IN.A 的值放入 acc(mov left acc)。接下來(lái)我們開(kāi)始執(zhí)行【向下方發(fā)送 A 次 B 的任務(wù)】。這時(shí)候我們可以把 A 當(dāng)作剩余次數(shù)計(jì)數(shù)器來(lái)用:每發(fā)送一個(gè) B,就令 A 減 1,直到 A 減到 0 為止,改為發(fā)送最終的 -999。所以我們收到 A 后,檢查 A 是否是 0。若 A 為 0,則跳到第 10 行去執(zhí)行(jez a)。當(dāng) A 不為 0 時(shí),說(shuō)明 B 沒(méi)有發(fā)送過(guò)足夠多的次數(shù),此時(shí)我們將 bak 里的 B 換出來(lái)發(fā)給下面,發(fā)完后再換回去(swp, mov acc down, swp)。每發(fā)送一次 B,就令 A 減 1(sub 1)并判斷是否減到了 0。只要 A 未減到 0,我們就跳回第 5 行繼續(xù)向下發(fā)送 B 值(jnz 5),直到 A 減到 0 后,向下發(fā)送一個(gè) 999,準(zhǔn)備執(zhí)行下一次任務(wù)(mov 999 down)。

中央節(jié)點(diǎn)純傳話(mov up down)。

下方節(jié)點(diǎn)首先將 acc 初始化為 -999(mov -999 acc),然后不斷從上方接收值。每收到上方傳來(lái)的一個(gè)值,就無(wú)腦累加到自己的 acc 里(add up),然后判定 acc 是否仍為負(fù)數(shù)。只要 acc 仍為負(fù)數(shù),就跳回到第 2 行繼續(xù)累加(jlz 2);當(dāng) acc 變?yōu)?0 或正數(shù)后,就說(shuō)明上方發(fā)送了最終的 +999 偏置修正量。我們直接將本次的正確答案發(fā)給下方的 OUT 端口即可(mov acc down)。

點(diǎn)擊左下角的【RUN】,稍等片刻,便會(huì)彈出結(jié)算界面:

利用乘法交換律給程序加速

我們知道,A x B 既可以通過(guò)累加 A 次 B 得到,也可以通過(guò)累加 B 次 A 得到。那么我們可以事先比較一下 A 和 B 的大小,將其中較大的一方視為【操作數(shù)】,較小的一方視為【累加次數(shù)】。例如,當(dāng) A = 3, B = 8 時(shí),我們最好選擇計(jì)算 8 + 8 + 8,而不是 3 + 3 + 3 + 3 + 3 + 3 + 3 + 3。具體到代碼里,就是 acc 里存較小的數(shù)字,bak 里存較大的數(shù)字,上方的節(jié)點(diǎn)給下方發(fā) acc 次 bak 后,再發(fā)一個(gè) 999。代碼如下:

左上方的節(jié)點(diǎn)沒(méi)啥好說(shuō)的,將得到的 A 值給右邊發(fā)送兩遍(mov up acc, mov acc right, mov acc right)。我們現(xiàn)在已經(jīng)很熟練了,找兩者中的較大/較小值時(shí),其中一方必然要將自己的數(shù)提供兩遍。

右上方的節(jié)點(diǎn)首先將 B 存入 bak(mov up acc, sav),然后計(jì)算 B - A 的值(sub left)。若差值大于 0,則跳到第 9 行執(zhí)行(jgz 9)。第 5~8 行僅當(dāng)差值小于等于 0 時(shí)才會(huì)被執(zhí)行:差值小于等于 0 時(shí),說(shuō)明 B 是較小的一方,A 是較大的一方。此時(shí)我們先發(fā)送較大的 A(mov left down),再發(fā)送較小的 B(swp, mov acc down, jmp 1)。第 9~11 行僅當(dāng)差值大于 0 時(shí)才會(huì)被執(zhí)行:差值大于 0 時(shí),說(shuō)明 A 是較小的一方,B 是較大的一方。此時(shí)我們正好反過(guò)來(lái),先發(fā)送較大的 B(swp, mov acc down),再發(fā)送較小的 A(mov left down)。

中央節(jié)點(diǎn)首先收到的是較大的【操作數(shù)】,將其放入 bak(mov up acc, swp);第二次收到的是較小的【累加次數(shù)】,將其放入 acc(mov up acc)。接下來(lái)的邏輯和上一版方案完全一樣,向它的下方節(jié)點(diǎn)發(fā)送 acc 次 bak,最后發(fā)送一個(gè) 999。

最下方的節(jié)點(diǎn)的代碼沒(méi)有任何改動(dòng)。點(diǎn)擊左下角的【RUN】,稍等片刻,便會(huì)彈出結(jié)算界面:

至此,我們程序的運(yùn)行時(shí)長(zhǎng)縮短到了 992?周期。

【TIS-100 攻略】第 13 關(guān):乘法器的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
梁平县| 缙云县| 新巴尔虎右旗| 鹤山市| 安阳县| 岑巩县| 赤城县| 正安县| 桂阳县| 固始县| 兴隆县| 莱州市| 富裕县| 弥渡县| 宕昌县| 上虞市| 镇平县| 汽车| 卓尼县| 阜新| 永年县| 琼结县| 额尔古纳市| 许昌市| 黄浦区| 通道| 阿克陶县| 含山县| 汉川市| 彭水| 聂荣县| 乌什县| 霍州市| 辉县市| 忻州市| 新营市| 建水县| 泊头市| 石河子市| 应城市| 临沧市|