了解为啥执行某些位操作操作

Posted

技术标签:

【中文标题】了解为啥执行某些位操作操作【英文标题】:Understanding why certain bit manipulation operations are performed了解为什么执行某些位操作操作 【发布时间】:2019-05-15 18:16:20 【问题描述】:

以下是 Java 中 Keytab 实现的源代码。这个 sn-p 从 keytab 文件中读取密钥版本。我无法理解这是如何工作的。 为什么要进行按位与和左移操作?

我的代码调用:

KeyTab keytab = KeyTab.getInstance(keytabFile); // passing keytab file location. 

此文件为二进制格式。 KeyTabInputStream 读取数据。

  private void load(KeyTabInputStream var1) throws IOException, RealmException 
        this.entries.clear();
        **this.kt_vno = var1.readVersion();**
        if (this.kt_vno == 1281) 
            var1.setNativeByteOrder();
        

        boolean var2 = false;

        while(var1.available() > 0) 
            int var4 = var1.readEntryLength();
            KeyTabEntry var3 = var1.readEntry(var4, this.kt_vno);
            if (DEBUG) 
                System.out.println(">>> KeyTab: load() entry length: " + var4 + "; type: " + (var3 != null ? var3.keyType : 0));
            

            if (var3 != null) 
                this.entries.addElement(var3);
            
        

    
    public int readVersion() throws IOException 
        int var1 = (this.read() & 255) << 8;
        return var1 | this.read() & 255;
    

【问题讨论】:

请添加更多上下文。指向在线源代码或至少粘贴整个方法体,以便人们清楚地了解类型和语义。 【参考方案1】:

this.read() 大概返回 8 个“有趣”位,因为 &amp; 255 “检索”仅最后 8 位,将其移动 8 位意味着现在 9-16 位保存数据。 然后执行另一次读取 + &amp; 再次获得 8 位,| 与前一步的移位位相比,您现在有一个 int 设置了 16 个相关位:位 1-8 保存第二次读取的结果,而第 9-16 位保存第一次读取的位。

【讨论】:

更多可能read返回byte(也是8位,同意),你需要&amp; 255避免(抵消)符号扩展

以上是关于了解为啥执行某些位操作操作的主要内容,如果未能解决你的问题,请参考以下文章

为啥在进行 64 位操作时编译器会发生变化?

如何使用位掩码来允许/禁止某些位的操作

在 C 中的某些整数上使用位操作中断将整数转换为浮点数

64bit到底是啥?操作系统和cpu都在说64bit,但我不了解这到底是啥。

为啥位字节序是位域中的一个问题?

已将该虚拟机配置为使用 64 位客户机操作系统。但是,无法执行 64 位操作。