当前位置: 首页 > 知识库问答 >
问题:

位掩蔽无符号和有符号值

梁勇
2023-03-14

精明的加法学专家会注意到,它只能加到62位。我在编译器和芯片设计方面的经历告诉我,保留位值黄金。所以我们有两个(设置为零)。

那么这是否意味着:

问题一:

~表示36位移位,包含10位类型Id和其余36位本地Id:

#00000000000000000000#

    ShardID 3429的
  1. 二进制=1101 0110 0101
  2. 因此(hashedValue>>46)=00000 0 110 1 011 0010 1&
  3. 0xffff=1111 1111 1111 1111
  4. Shardid=00000 0 110 1 011 0010 1

我得到以下编译器错误:int类型的文字0xFFFFFFFFFF超出范围

public class BitExampleTest {
    public static void main(String[] args) {
      long pinId = 241294492511762325L;
      unHash(pinId);
    }

    private static long hash(int shardId, int typeId, int localId){
        return (shardId << 46) | (typeId << 36) | (localId << 0);
    }

    private static void unHash(long hashedValue){
               long shardID = (hashedValue >> 46) & 0xFFFF; 
               long typeID  = (hashedValue >> 36) & 0x3FF;
               long localID = (hashedValue >>  0) & 0xFFFFFFFFF;

               System.out.printf("shardID %s \n",shardID);
               System.out.printf("typeID %s \n",typeID);
               System.out.printf("localID %s \n",localID);
    }
}

共有1个答案

卫鸿朗
2023-03-14

它们可以有2^16,范围为0-65536个碎片?

碎片ID是16位。因此,可以使用2个16个不同的碎片ID。

类型ID为2^10,类型范围为0-1024?

// 'L' added to tell the compiler it is a long, not an int
System.out.println(Long.toBinaryString(241294492511762325L)); 

// output (padded with 0's on the left)
0000 0011 0101 1001 0100 0000 0001 0000 0000 0000 0110 1011 1111 0111 1001 0101

最初,241294492511762325的ID如下所示...

xx 00 0011 0101 1001 01 00 0000 0001 0000 0000 0000 0110 1011 1111 0111 1001 0101
XX [____SHARD(16)_____] [_TYPE(10)_] [________________LOCAL(36)_________________]

为了获得碎片位,将ID右移(10+36)46就可以了。这会让我们。请注意,XX左边的位可以是0或1,这取决于“最后两位”的符号扩展,等等。

xx 00 0011 0101 1001 01
XX [____SHARD(16)_____]

用0xFFFF取位AND

           'our 2 golden bits'
                   ▼▼
  xxxx xxxx xxxx xxxx 0000 1101 0110 0101
& 0000 0000 0000 0000 1111 1111 1111 1111
= 0000 0000 0000 0000 0000 1101 0110 0101
 类似资料:
  • 有符号和无符号变量在按位运算上有区别吗?< br >例如,在处理无符号数字时:< br> 将得到00000101。 但当处理带符号的数字时会发生什么?

  • 问题内容: 关于Java支持哪种无符号数据类型,我有些困惑。 我已经读过了,但我不理解它的非常复杂的解释(至少对我而言)。 问题答案: Java仅支持带符号的类型(除外),因为它假定对于初学者来说,一种类型比每种大小都具有两种类型更容易理解。在C语言中,它被认为是错误的根源,因此不包括对无符号类型的支持。 因此设计师选择了四种尺寸 ,8位 ,16位 ,32位 ,64位。 并保持一致性,他们都签署就

  • GCC和Clang似乎对有符号整数和无符号整数之间的加法有不同的解释,这取决于它们的大小。为什么会这样?所有编译器和平台上的转换是否一致? 举个例子: 结果: 在这两种情况下,我们得到了-1,但其中一个被解释为无符号整数和下溢。我本以为两者都会以同样的方式转化。 那么,为什么编译器会以如此不同的方式转换它们,这保证了一致性吗?我用G11.1.0和Clang12.0测试了这个。以及Arch Linu

  • 我在读一本教科书,上面写着: 必须注意机器代码如何区分有符号和无符号值。与C不同,它不将数据类型与每个程序值相关联。相反,它在这两种情况下大多使用相同的(汇编)指令,因为许多算术运算对于无符号和二补码算术具有相同的位级行为。 我不明白这意味着什么,有人能给我举个例子吗?

  • C语言有符号和无符号类型,如char和int。我不确定它是如何在程序集级别实现的,例如,在我看来,有符号和无符号的乘法会带来不同的结果,那么程序集是同时做无符号和有符号的算术,还是只做一个,这在某种程度上是针对不同情况模拟的?

  • 为什么无符号右移(逻辑右移)和有符号右移(算术右移)对负数产生相同的结果? Android Studio Logcat输出