簡體   English   中英

C#中的按位運算

[英]Bitwise operations in C#

是否有更短更好看的替代品

(b == 0) ? 0 : 1;

在按位運算方面?

此外,以獲得正確的符號(-1,0或1)給定的整數a我目前使用

(a > 0) ? 1 : (a >> 32);

有沒有更短(但不慢)的方式?

就個人而言,我堅持你的“等於或不等於”選項的第一個選項。

對於整數的符號,我將使用Math.Sign並假設JIT編譯器將內聯它 - 如果它被證明是一個潛在的瓶頸,則使用基准測試該假設。

首先考慮一下可讀性 - 你的第一段代碼非常明顯。 你的第二個不是。 我甚至不相信你的第二段代碼有效 ......我認為右移有效地被掩蓋到底部的5位,假設這是一個Int32int )。

編輯:剛檢查,確實你當前的第二段代碼相當於:

int y = x > 0 ? 1 : x;

轉換甚至不會在編譯的代碼中結束。

將此作為關於微觀優化而不是可讀性的更多關注課程。 如果易於理解,使代碼工作要容易得多。 如果你的代碼給出錯誤的結果,我不關心它的運行速度。

微觀優化是萬惡之源 你犧牲了一納秒的可讀性。 這是一個糟糕的交易

在按位操作方面......任何人都可以指出這一點嗎? 另外,要獲得我正在使用的給定整數的正確符號(-1,0或1)

(a > 0) ? 1 : (a >> 32); 

Armen Tsirunyan和Jon Skeet回答了您的技術問題,我將嘗試解釋您似乎遇到的一些技術誤解。

第一個錯誤是,如果你有一個32位有符號整數並試圖將其移位32,你將試圖查看第33位,在有符號基數2關節的情況下,它將是溢出位。

第二個錯誤是你有32位有符號二進制值。 最后一位可以是1或0。 只有一個零值。 因此,您試圖弄清楚該符號是否為(-1,0,1)的陳述清楚地表明您不理解這一事實。 如果有符號位為1,則數字為負數,如果為零,則為正數。 在.NET Framework中處理大部分數字的結構不知道2的補碼和1的補碼。 這當然並不意味着您無法擴展該功能或只是將有符號整數轉換為2的補碼(真的很簡單)。

我應該補充一點,當你有一個有符號整數時,只有一個值為零。 我想這是我的主要問題,你所做的“檢查簽名”聲明顯示了對二進制數字的誤解。

http://en.wikipedia.org/wiki/Signed_magnitude#Sign-and-magnitude

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM