簡體   English   中英

如何將ulong轉換為正整數?

[英]How can I convert a ulong to an positive int?

我有一段代碼是

// Bernstein hash
// http://www.eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx           
ulong result = (ulong)s[0];
for ( int i = 1; i < s.Length; ++i ) 
{ 
    result = 33 * result + (ulong)s[i]; 
}
return (int)result % Buckets.Count; 

問題是它有時返回負值。 我知道原因是因為(int)result可能為負。 但是我想強迫它為非負數,因為它被用作索引。 現在我意識到我可以做

int k = (int)result % Buckets.Count; 
k = k < 0 ? k*-1 : k;
return k; 

但是有更好的方法嗎?

更深入地講,為什么在C#中將int用作容器的索引? 我來自C ++背景,我們有size_t ,這是一個無符號整數類型。 這對我來說更有意義。

采用

return (int)(result % (ulong)Buckets.Count);

在對值求和時,您將獲得一個正整數,該正整數不能以帶符號的32位整數表示為正數。 強制轉換為int將返回負數。 然后,取模操作還將返回負數。 如果先進行模運算,則將得到一個低的正數,並且強制轉換為int不會造成任何損害。

盡管您可以找到一種將其正確轉換為int ,但我想知道為什么您不從一開始就將其作為int計算。

int result = (int)s[0]; // or, if s[0] is already an int, omit the cast
for ( int i = 1; i < s.Length; ++i ) 
{ 
    result = 33 * result + (int)s[i]; 
}
return Math.Abs(result) % Buckets.Count;

關於C# 為什么將帶符號的int用於索引,它與跨語言兼容性有關

暫無
暫無

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

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