2

我在一个长数组中有一系列长数字。我想获取每个 Long 数字并想要获取它的第一位,并且根据第一位,我想处理其他位。就像下面的伪代码一样,

i = 1000000 ;
long[] a = new long[i];
for j = 0  to i
 do,
  get long lo = a[i];

  // get first bit of lo

  if first bit = 0
     print long number (by removing first bit) in file a1

  else 
     print long number (by removing first bit) in file a2

任何人都可以帮助我,“获得那个长数字的第一位”和“删除第一位并获得数字”的最快方法是什么?

4

4 回答 4

5

用 1 位掩码数字。

long temp = a[i];
int bit = (temp >> 63) & 1;

这会将数字移动 63 位并按位移动数字和 1。如果该位为 1,则为 1,如果该位为 0,则为 0。

如果您想要最低位,则无需移动

int bit = temp & 1;
于 2012-04-25T20:57:21.583 回答
3

twain249 在测试部分击败了我,但这是您问题另一部分的答案:

long longWithoutTheFirstBit = a[i] & 0x7fffffff;
于 2012-04-25T20:59:48.593 回答
1

long 是一个 8 字节的数字,所以要获得第一位,你可以做


long l = ...
long firstBit = l & 0x80000000; // this will be 0 if the first bit is 0

请注意,在二进制补码中,第一位是符号位。

要获得没有第一位的数字,您可以执行 l - firstBit 或者您可以执行

长 noFirstBit = l & 0x7FFFFFFF

于 2012-04-25T21:00:19.810 回答
1

获取第一位:number >>> 63-- 注意三个 > 符号 -- 那是无符号右移!

删除第一位:number & ~(1L << 63)

于 2012-04-25T21:01:14.453 回答