2012-01-27 47 views
7

Trong khi duyệt thi hành Dictionary<TKey, TValue> lớp generic trong mscorlib.dll, tôi nhận thấy những điều sau đây sử dụng nhiều lần để có được một băm-key: GetHashCodeGetHashCode (key) & int.MaxValue

int num = this.comparer.GetHashCode(key) & int.MaxValue; 

() lợi nhuận một int. Tôi có nhầm lẫn khi nghĩ rằng bitwise AND giữa int.MaxValue và bất kỳ số nguyên nào x, sẽ luôn trả lại x?

Ai đó có thể giải thích tại sao toán tử & được sử dụng theo cách trên?

Trả lời

10

Giá trị của int.MaxValue0x7FFFFFFF - bit quan trọng nhất là số không. Do đó khi bạn thực hiện một bitwise và với một int, bạn có hiệu quả zero-out bit 'dấu'. Lưu ý rằng do mã hóa được sử dụng two's complement, -1 sẽ không trở thành 1 mà là 2,147,483,647.

Rõ ràng, vì một số lý do chỉ các số nguyên dương được phép trong biến số num trong mẫu mã của bạn.

+3

Lý do có khả năng nhất để thực hiện việc này là giá trị của số lượng modulo kết quả của các nhóm sẽ được tính toán, để có được nhóm đúng. Điều đó sẽ không hiệu quả đối với các số âm. – svick

+0

Tôi muốn sẵn sàng đặt cược một đồng đô la toàn bộ việc thực hiện Từ điển trong .NET không quan tâm liệu mã băm có dương hay âm hay không, và người viết mã đang thực hiện nó trong một nỗ lực (có thể không được thông báo) để tránh kết hợp các hệ số chính với số lượng nhóm: http://stackoverflow.com/questions/3613102/why-use-a-prime-number-in-hashcode –

+0

@Chris: Theo OP, mã đó * là * từ thực thi .NET 'Dictionary '. Như svick gợi ý, có lẽ để đảm bảo rằng số thùng - một chỉ số mảng, iirc - luôn dương. – LukeH

1

Nó sẽ không ảnh hưởng đến các số dương

  • [0, int.MaxValue] -> vẫn không thay đổi
  • [int.MinValue, -1] -> sẽ làm thay đổi dấu chút
+0

Câu lệnh thứ hai không đúng. 'int.MinValue & int.MaxValue == 0'. Giá trị âm sẽ trả về dưới dạng (giá trị + 2147481498). –

+0

'int.MinValue & int.MaxValue == 0' ... nhưng đó chính xác là thay đổi bit dấu, tôi đoán đó là chính xác. Dù sao, Ondrej cung cấp một lời giải thích tốt hơn. – doblak