#92: 不用if 也沒有任何轉組語帶分支的做法


164253 (pudding164253)

學校 : 不指定學校
編號 : 1822
來源 : [140.116.247.244]
最後登入時間 :
2024-11-12 17:39:09
a017. BASIC 的 SGN 函數 -- 板橋高中教學題 | From: [182.234.181.208] | 發表日期 : 2024-06-23 01:35

顯然的 無論是大於,小於,三元運算,帶短路的&&和||,while,goto,do while都是一種分支 且組語中也會有對應的jmp出現

(n>0)-(n<0)已經是最接近的 但還是用到了大於和小於

為了避免這個 要運用int32在負數符號位是1的性質

只要判斷n>>31&1就能得到n<0了

接著可以判斷n>0 但也可以直接判斷n!=0就好 實作上只要

n=n|n>>16;

n=n|n>>8;

n=n|n>>4;

n=n|n>>2;

n=n|n>>1;

最後無論n原本是多少 只要有任何一個bit是1 他往下的所有bit就都會是1

因此n&1和n!=0是相同的

而由於n>0被我們改成了n!=0 在n<0的情況要多減一

所以(n&1)-((n>>31&1)<<1)就會是最終的答案(上面那堆|記得要做)

 
ZeroJudge Forum