[英]Set every nth bit in an integer without for loop
有沒有辦法在不使用 for 循環的情況下設置 integer 中的每個第 n 位?
例如,如果n = 3
,那么結果應該是...100100100100
。 使用 for 循環很容易做到這一點,但我很好奇這是否可以在沒有循環的情況下完成。
--
對於我的特定應用程序,我需要使用自定義 256 位 integer 類型來執行此操作,該類型具有內置 integer 具有的所有位操作。 我目前正在使用延遲初始化的表(使用 for 循環),這對於我正在做的事情來說已經足夠了。 對我來說,這主要是一個有點旋轉的練習,但我無法通過幾個步驟/說明來弄清楚如何做到這一點,也無法輕易在網上找到任何關於此的內容。
…我需要使用自定義的 256 位 integer 類型來執行此操作。
將r
設置為256 % n
。
將d
設置為((uint256_t) 1 << n) - 1
。 那么d
的二進制表示是一個n
1 位的字符串。
將t
設置為UINT256_MAX << r >> r
。 這將從UINT256_MAX
中刪除頂部r
位。 UINT256_MAX
當然是 2 256 -1。 這將t
保留為width-r
1 位的字符串,而width-r
是n
的某個倍數,例如k*n
。
將t
設置為t/d
。 作為一串k*n
1 位除以一串n
1 位,這將產生一個000…0001
重復k
次的商,其中每個000…0001
是n-1
0 位后跟一個 1 位。
現在t
是所需的位模式,但如果r
不為零,則可能會丟失最高的所需位。 要添加此位,如果需要,或t
與t << n
。
現在t
是所需的值。
交替:
將t
設置為 1。
或t
與t << n
。
或t
與t << 2*n
。
或t
與t << 4*n
。
或t
與t << 8*n
。
或t
與t << 16*n
。
或t
與t << 32*n
。
或t
與t << 64*n
。
或t
與t << 128*n
。
當移位量超過 integer 寬度,256 位時,必須定義這些移位(移位零就足夠了)或抑制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.