[英]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.