【學Rust寫CAD】35 alpha_mul_256(alpha256.rs補充方法)

源碼

// Calculates (value * alpha256) / 255 in range [0,256],
// for [0,255] value and [0,256] alpha256.
pub fn alpha_mul_256(self,value: u32) -> Alpha256 {let prod = value * self.0;Alpha256((prod + (prod >> 8)) >> 8)
}

代碼分析

這個函數 alpha_mul_256 執行了一個快速的乘法運算,用于計算 (value * alpha256) / 255,其中 value 的范圍是 [0, 255],alpha256 的范圍是 [0, 256]。這個操作在圖形處理和顏色混合中很常見,比如計算帶透明度的顏色疊加。

參數:
  • self:一個 Alpha256 類型的值,表示透明度 alpha256,范圍是 [0, 256]。

  • value:一個 u32 類型的值,范圍是 [0, 255],表示要乘以透明度的值。

返回值:
  • 返回 Alpha256 類型,表示 (value * alpha256) / 255 的結果,范圍是 [0, 256]。

計算過程:

  1. 計算乘積:
let prod = value * self.0;
  • prod = value * alpha256,這是一個普通的乘法,范圍是 [0, 255 * 256]。

近似除以 255:

(prod + (prod >> 8)) >> 8
  • 這里用了一個技巧來近似計算 prod / 255。

  • prod >> 8 等價于 prod / 256。

  • prod + (prod >> 8) 等價于 prod + prod / 256。

  • 最后 >> 8 等價于除以 256,因此整體是 (prod + prod / 256) / 256。

為什么這是近似 prod / 255?

  • 數學上,(prod + prod / 256) / 256 可以展開為:
(prod + prod / 256) / 256 = prod / 256 + prod / (256 * 256)
= prod * (1/256 + 1/65536)
= prod * (257/65536)
= prod * (257/65536)
  • 而 1 / 255 ≈ 257 / 65536,因為 257 / 65536 ≈ 0.00392156862745098,而 1 / 255 ≈ 0.00392156862745098,兩者非常接近。

  • 因此,這個技巧用整數運算高效地近似了除以 255 的操作。

  1. 返回結果:
  • 最終結果是一個 Alpha256 類型,范圍是 [0, 256]。

示例:

假設 value = 255(最大值),alpha256 = 128(半透明):

  1. prod = 255 * 128 = 32640。

  2. prod >> 8 = 32640 / 256 = 127。

  3. prod + (prod >> 8) = 32640 + 127 = 32767。

  4. (prod + (prod >> 8)) >> 8 = 32767 / 256 = 127。

  • 精確計算:255 * 128 / 255 = 128,這里結果是 127,誤差為 1,在合理范圍內。

總結:

這個函數用高效的整數運算(乘法和位移)近似計算了 (value * alpha256) / 255,避免了昂貴的除法操作,適合性能敏感的圖形計算場景。雖然結果可能有微小誤差,但在大多數情況下可以接受。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/77029.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/77029.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/77029.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C# 與 相機連接

一、通過組件連接相機 需要提前在VisionPro里面保存一個CogAcqFifoTool相機工具為 .vpp 定義一個相機工具 CogAcqFifoTool mAcq null;將保存的相機工具放入mAcq中 string path “C:\Acq.vpp”; mAcq (CogAcqFifoTool)CogSerializer.LoadObjectFrommFile(path);給窗口相機…

Java并發編程高頻面試題

一、基礎概念 1. 并行與并發的區別? 并行:多個任務在多個CPU核心上同時執行(物理上同時)。并發:多個任務在單CPU核心上交替執行(邏輯上同時)。類比:并行是多個窗口同時服務&#x…

LiT and Lean: Distilling Listwise Rerankers intoEncoder-Decoder Models

文章:ECIR 2025會議 一、動機 背景:利用LLMs強大的能力,將一個查詢(query)和一組候選段落作為輸入,整體考慮這些段落的相關性,并對它們進行排序。 先前的研究基礎上進行擴展 [14,15]&#xff0c…

Python高級爬蟲之JS逆向+安卓逆向1.2節: 變量與對象

目錄 引言: 1.2.1 Python中的變量 1.2.2 變量的命名與可讀性 1.2.3 Python中的對象 1.2.4 跟大神學高級爬蟲安卓逆向 引言: 大神薯條老師的高級爬蟲安卓逆向教程: 這套爬蟲教程會系統講解爬蟲的初級,中級,高級知…

可發1區的超級創新思路(python 實現):一種輕量化的動態稀疏門控網絡

首先聲明,該模型為原創!原創!原創!且該思路還未有成果發表,感興趣的小伙伴可以借鑒! 一、應用領域 視頻異常檢測、生成視頻檢測。 二、模型解析 該模型由1.關鍵幀動態選擇機制、2.關鍵幀動態選擇機制以及3.關鍵幀動態選擇機制三大核心組件構成,形成端到端的視頻異常…

使用NVM下載Node.js管理多版本

提示:我解決這個bug跟別人思路可能不太一樣,因為我是之前好用,換個項目就不好使了,倦了 文章目錄 前言項目場景一項目場景二解決方案:下載 nvm安裝 nvm重新下載所需Node 版本nvm常用命令 項目結構說明 前言 提示&…

MySQL數據庫經典面試題解析

1. MySQL 索引使用有哪些注意事項呢? 可以從三個維度回答這個問題:索引哪些情況會失效,索引不適合哪些場景,索引規則 索引哪些情況會失效 查詢條件包含or,可能導致索引失效如何字段類型是字符串,where時一定用引號括起來,否則索引失效like通配符可能導致索引失效。聯合…

C#結合SQLite數據庫使用方法

一、關于SQLite SQLite 是一個輕量級的嵌入式關系型數據庫管理系統(RDBMS)。與傳統的數據庫管理系統(如 MySQL、PostgreSQL 或 SQL Server)不同,SQLite 并不需要運行單獨的服務器進程,它的數據庫存儲在一個…

深入解析 MySQL 中的日期時間函數:DATE_FORMAT 與時間查詢優化

深入解析 MySQL 中的日期時間函數:DATE_FORMAT 與時間查詢優化 在數據庫管理和應用開發中,日期和時間的處理是不可或缺的一部分。MySQL 提供了多種日期和時間函數來滿足不同的需求,其中DATE_FORMAT函數以其強大的日期格式化能力,…

如何深刻理解Reactor和Proactor

前言: 網絡框架的設計離不開 I/O 線程模型,線程模型的優劣直接決定了系統的吞吐量、可擴展性、安全性等。目前主流的網絡框架,在網絡 IO 處理層面幾乎都采用了I/O 多路復用方案(又以epoll為主),這是服務端應對高并發的性能利器。 …

筆試專題(七)

文章目錄 乒乓球筐(哈希)題解代碼 組隊競賽題解代碼 刪除相鄰數字的最大分數(線性dp)題解代碼 乒乓球筐(哈希) 題目鏈接 題解 1. 兩個哈希表 先統計第一個字符串中的字符個數,再統計第二個字…

清晰易懂的 Flutter 卸載和清理教程

以下是為 Flutter 徹底卸載與清理教程,覆蓋 Windows、macOS、Linux 系統,步驟清晰無殘留,確保完全刪除 Flutter SDK、依賴工具及 IDE 配置。 一、通用步驟:確認 Flutter 安裝方式 Flutter 通常通過以下方式安裝: 手動…

關于反卷積

🧠 什么是反卷積? 反卷積(Deconvolution),通常也稱為轉置卷積(Transpose Convolution),是一種用于擴展輸入特征圖的操作,通常用于生成圖像或上采樣任務中。與標準卷積操…

【機器學習】ROC 曲線與 PR 曲線

目錄 一、混淆矩陣:分類評估的基礎 二. ROC 曲線 (Receiver Operating Characteristic Curve) 三. PR 曲線 (Precision-Recall Curve) 3.1 核心思想 4. 何時使用 ROC 曲線和 PR 曲線? 實驗結果 6. 總結 在機器學習的分類任務中,我們訓…

Python高階函數-map

map() 是 Python 內置的一個高階函數,它接收一個函數和一個可迭代對象作為參數,將函數依次作用在可迭代對象的每個元素上,并返回一個迭代器(Python 3.x 中)。 基本語法 map(function, iterable, ...)function: 應用于…

上海餐飲市場數據分析與可視化

上海作為中國的經濟中心和國際化大都市,其餐飲市場具有高度的多樣性和競爭性。隨著消費者需求的不斷變化,餐飲行業的從業者和投資者需要深入了解市場現狀和趨勢,以便制定更有效的商業策略。本文將通過數據分析和可視化技術,深入探討上海餐飲市場的現狀和趨勢,為餐飲從業者…

MySQL基礎 [五] - 表的增刪查改

目錄 Create(insert) Retrieve(select) where條件 ?編輯 NULL的查詢 結果排序(order by) 篩選分頁結果 (limit) Update Delete 刪除表 截斷表(truncate) 插入查詢結果(insertselect&…

SQL:Primary Key(主鍵)和Foreign Key(外鍵)

目錄 1. Key(鍵) 2. Index(索引) 3.Key和Index的區別 4. Primary Key(主鍵) 5. Foreign Key(外鍵) 6.主鍵和外鍵的關系 溫馨提示: 閃電按鈕不同的執行功能 首先&…

2025年- H1-Lc109-160. 相交列表--java版

1.題目描述 2.思路 “雙指針切換鏈表頭” 思路一:雙指針路徑對齊 while (pA ! pB) { pA (pA null) ? headB : pA.next; pB (pB null) ? headA : pB.next; } 讓兩個指針走相同的總路徑長度! 設: 鏈表 A 獨有部分長度是 lenA 鏈表 B …

PyTorch 深度學習 || 6. Transformer | Ch6.3 Transformer 簡單案例

1. 簡單案例 這個代碼是一個簡單的 Transformer 模型的實現,這個例子展示了一個基本的序列到序列(seq2seq)任務,比如將一個數字序列轉換為另一個數字序列。可以用于學習和理解 Transformer 的基本結構和工作原理。 import torch import torch.nn as nn import math# 位置…