Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# - Making one Int64 from two Int32s

Tags:

c#

Is there a function in c# that takes two 32 bit integers (int) and returns a single 64 bit one (long)?

Sounds like there should be a simple way to do this, but I couldn't find a solution.

like image 883
DarkAmgine Avatar asked May 05 '09 22:05

DarkAmgine


People also ask

What C is used for?

C programming language is a machine-independent programming language that is mainly used to create many types of applications and operating systems such as Windows, and other complicated programs such as the Oracle database, Git, Python interpreter, and games and is considered a programming foundation in the process of ...

Is C language easy?

Compared to other languages—like Java, PHP, or C#—C is a relatively simple language to learn for anyone just starting to learn computer programming because of its limited number of keywords.

What is the full name of C?

In the real sense it has no meaning or full form. It was developed by Dennis Ritchie and Ken Thompson at AT&T bell Lab. First, they used to call it as B language then later they made some improvement into it and renamed it as C and its superscript as C++ which was invented by Dr.


3 Answers

Try the following

public long MakeLong(int left, int right) {
  //implicit conversion of left to a long
  long res = left;

  //shift the bits creating an empty space on the right
  // ex: 0x0000CFFF becomes 0xCFFF0000
  res = (res << 32);

  //combine the bits on the right with the previous value
  // ex: 0xCFFF0000 | 0x0000ABCD becomes 0xCFFFABCD
  res = res | (long)(uint)right; //uint first to prevent loss of signed bit

  //return the combined result
  return res;
}
like image 124
JaredPar Avatar answered Nov 16 '22 18:11

JaredPar


Just for clarity... While the accepted answer does appear to work correctly. All of the one liners presented do not appear to produce accurate results.

Here is a one liner that does work:

long correct = (long)left << 32 | (long)(uint)right;

Here is some code so you can test it for yourself:

long original = 1979205471486323557L;
int left = (int)(original >> 32);
int right = (int)(original & 0xffffffffL);

long correct = (long)left << 32 | (long)(uint)right;

long incorrect1 = (long)(((long)left << 32) | (long)right);
long incorrect2 = ((Int64)left << 32 | right);
long incorrect3 = (long)(left * uint.MaxValue) + right;
long incorrect4 = (long)(left * 0x100000000) + right;

Console.WriteLine(original == correct);
Console.WriteLine(original == incorrect1);
Console.WriteLine(original == incorrect2);
Console.WriteLine(original == incorrect3);
Console.WriteLine(original == incorrect4);
like image 23
Jake Drew Avatar answered Nov 16 '22 19:11

Jake Drew


Try

(long)(((long)i1 << 32) | (long)i2)

this shifts the first int left by 32 bits (the length of an int), then ors in the second int, so you end up with the two ints concatentated together in a long.

like image 3
thecoop Avatar answered Nov 16 '22 18:11

thecoop