亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將 0/1 轉換為有效簽名?

如何將 0/1 轉換為有效簽名?

料青山看我應如是 2022-05-24 18:18:42
看下面的函數,其中a是一個無符號字節 0-255,b是一個浮點數:def convert(a, b):    if a & 0x80:        return -b    return bb如果第一個位被設置,它會否定a,但如果不是,則什么都不做。人們可能會認為這不是那么酷,因為條件語句破壞了 CPU 中的分支預測。因此,人們會嘗試將其轉換為計算。但我只找到了這個解決方案,看起來效率不高:def convert(a, b):    return (-1)**(a & 0x80) * b哪個效率更高?編譯器是否簡化了第二個?有沒有更好的辦法?
查看完整描述

2 回答

?
陪伴而非守候

TA貢獻1757條經驗 獲得超8個贊

這是 Python。在您可能想到的意義上,沒有編譯器。假設您使用的是 CPython(參考解釋器),所有內容都通過一個巨大的 switch 語句循環運行,該語句讀取并解釋每個字節碼。您對分支預測的擔憂在這里無關緊要;在您執行的每個操作中,在類型檢查、動態函數指針查找和調用等之間,都會有六個 CPU 級分支。switch當它最終讀取字節碼時,遠程跳轉可能會稍微損害數據緩存幾百字節之外,而不是下一個字節碼,但分支預測(或缺少分支預測)不是問題(100% 可預測的跳轉也會有同樣的問題)。

基本上,你在這里所做的任何可能在 C 中工作并被編譯器的優化器優化為理想代碼的東西在 CPython 中都不起作用。所以不要打擾。編寫您的完整代碼,如果它太慢,則對其進行分析,然后努力優化“最熱門”(最常被調用)的部分。你在這里進行了過早的優化,真的應該停止。

如果我是你,我會選擇選項#1(可能替換if a & 0x80:為,if a >= 0x80:因為前者需要返回一個int必須進行更昂貴的真值測試,而后者bool直接返回,這是最便宜的真值測試) ,因為它很簡單,不太可能很糟糕;僅當您的程序太慢時才調查其他選項,并且分析表明這段特定的代碼是熱點


查看完整回答
反對 回復 2022-05-24
?
www說

TA貢獻1775條經驗 獲得超8個贊

(-1)**(a & 0x80)計算功率,所以它非常低效。實際上,您可以將其替換1 if exponent & 1 == 0 else -1為 exponent being a & 0x80。但是通過做從 0 或 1 得到 1 和 -1 更容易x*2 - 1


一些非分支版本


return (((a >> 7) << 1) - 1)*b;

return (((a >> 6) & 0x02) - 1)*b;

return math.copysign(b, -(a >> 7));

return math.copysign(b, -(a & 0x80));


查看完整回答
反對 回復 2022-05-24
  • 2 回答
  • 0 關注
  • 109 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號