2009-07-30 25 views
8

Cách tốt nhất để kết hợp hai uints thành một ulong trong C#, thiết lập các uints cao/thấp là gì.Cách tốt nhất để kết hợp hai uints thành một ulong trong C#

Tôi biết bithifting có thể làm điều đó, nhưng tôi không biết cú pháp, hoặc có thể các API khác để trợ giúp như BitConverter, nhưng tôi không thấy một phương pháp làm những gì tôi muốn.

Trả lời

18
ulong mixed = (ulong)high << 32 | low; 

Dàn diễn viên rất quan trọng. Nếu bạn bỏ qua các diễn viên, xem xét thực tế là high là loại uint (là 32 bit), bạn sẽ được chuyển một giá trị 32 bit 32 bit sang trái. Các toán tử dịch chuyển trên các biến 32 bit sẽ sử dụng công cụ dịch chuyển theo số right-hand-side mod 32. Hiệu quả, dịch chuyển một số uint 32 bit sang bên trái là số không. Truyền tới ulong ngăn điều này.

Thẩm định thực tế này là dễ dàng:

uint test = 1u; 
Console.WriteLine(test << 32); // prints 1 
Console.WriteLine((ulong)test << 32); // prints (ulong)uint.MaxValue + 1 
+0

Chỉ vì tò mò, tại sao dàn diễn viên lại cần thiết? – LiraNuna

+0

Nếu cao chỉ là một int, sau đó cao << 32 sẽ là tất cả các số không, bởi vì bạn chỉ cần chuyển tất cả những cái hoàn toàn ra khỏi biến. Bạn cần nó là số nguyên 64 bit * trước * bạn bắt đầu dịch chuyển nó. –

+0

Aric: "bạn vừa chuyển tất cả những cái hoàn toàn ra khỏi biến" điều này không hoàn toàn đúng. Đọc câu trả lời cập nhật của tôi. –

2
ulong output = (ulong)highUInt << 32 + lowUInt 

Các <<>> khai thác bitshift bên trái (cao hơn) và phải (thấp hơn), tương ứng. highUInt << 32 có chức năng giống như highUInt * Math.Pow(2, 32), nhưng có thể nhanh hơn và là (IMO) cú pháp đơn giản hơn.

+0

Không đúng. 'highInt << 32 == highInt' nếu' highInt' là 'uint'. –

+0

Cảm ơn, đã thêm diễn viên. –

1

Bạn cần phải chuyển đổi các highInt đến một ulong trước khi bạn bitshift:

ulong output = highInt; 
output = output << 32; 
output += lowInt; 
1

Encoding:

ulong mixed = (ulong)hi << 32 | lo; 

Giải mã:

uint lo = (uint)(mixed & uint.MaxValue); 
uint hi = (uint)(mixed >> 32); 
Các vấn đề liên quan