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

如何仅替换1字节的4位?

袁羽
2023-03-14

我知道我可以在1字节内存储和检索2个4位数字,如下所示:

// Store both numbers in one byte
byte firstNumber = 10;
byte secondNumber = 15;
byte bothNumbers = (byte) ((firstNumber << 4) | secondNumber);

// Retreive the original numbers
firstNumber = (byte) ((bothNumbers >> 4) & (byte) 0x0F);
secondNumber = (byte) (bothNumbers & 0x0F);

但是,我如何在不触及最后4位(15)的情况下覆盖这两个数字中的一个(比如第一个(10))?

// Store both numbers in one byte
byte firstNumber = 10;
byte secondNumber = 15;
byte bothNumbers = (byte) ((firstNumber << 4) | secondNumber);

// Replacing one of the 2 numbers without touching the other
firstNumber = 13;
bothNumbers = ...

共有2个答案

蓬宾白
2023-03-14

在静态编程语言中,您可以创建一个值类以方便使用。它只编译为Byte,但您可以方便地将其视为类实例/可装箱原语。

@JvmInline
value class FourBitPair(val bothNumbers: Byte) {
    constructor(firstNumber: Byte, secondNumber: Byte):
            this((firstNumber.toInt() shl 4 or secondNumber.toInt()).toByte())

    val firstNumber: Byte get() = ((bothNumbers.toInt() shr 4) and 0xF).toByte()
    val secondNumber: Byte get() = (bothNumbers.toInt() and 0xF).toByte()

    operator fun component1() = firstNumber
    operator fun component2() = secondNumber

    fun withFirstNumber(newFirstNumber: Byte) = FourBitPair(newFirstNumber, secondNumber)
    fun withSecondNumber(newSecondNumber: Byte) = FourBitPair(firstNumber, newSecondNumber)

    override fun toString(): String = "[$firstNumber, $secondNumber]"
}
fun main() {
    val x: Byte = 3
    val y: Byte = 15
    var pair = FourBitPair(x, y)
    println(pair)
    pair = pair.withFirstNumber(13)
    println(pair)
    pair = pair.withSecondNumber(4)
    println(pair)
    val (first, second) = pair
    println(second)
    println(pair.bothNumbers)
}

打印:

[3, 15]
[13, 15]
[13, 4]
4
-44
芮祺
2023-03-14

你会使用这样的东西:

bothNumbers = (byte) ((bothNumbers & 0xf) | (firstNumber << 4))
 类似资料:
  • 问题内容: 我在字符串前后有HTML代码: 我想将替换为: 所以我做了一个简单的正则表达式: 但是我看不到如何专门替换捕获的块。 有没有办法用其他字符串替换捕获的结果($ 1)? 结果将是: 问题答案: 一种解决方案是为前面和后面的文本添加捕获:

  • 问题内容: 我想执行转换而不求助于某些依赖于实现的技巧。有小费吗? 问题答案: 您需要知道字节的字节序。 假设(例如@ WhiteFang34),其是一个长度为4的,然后… … 大端: 小端:

  • 问题内容: 我正在尝试使用Java方法从数据库中获取以下xml,但出现错误 用于解析xml的代码 数据 错误 我读了一些线程,这是因为xml中有一些特殊字符。如何解决这个问题? 问题答案: 如何解决这个问题? 使用正确的字符编码读取数据。错误消息表示您正在尝试以UTF-8格式读取数据(故意或因为这是未指定的XML文件的默认编码),但实际上它采用的是其他编码,例如ISO-8859-1或Windows

  • 问题内容: 我需要将缓冲区的长度存储在4个字节大的字节数组中。 伪代码: 做到这一点的最佳方法是什么?请记住,稍后我必须将该字节数组转换回整数。 问题答案: 您可以使用以下方式将其转换为字节: 注意,这样做时可能必须考虑字节顺序。

  • 我正在开发一个非常大、旧的spring3冬眠3项目,我的任务是将其升级到spring4冬眠4。 显然,HibernateTemplate在hibernate4中不再受支持,所以当我升级时,我们的客户端代码会中断。 我们所有的DAO都扩展了HibernateDaoSupport。许多DAO代码如下: 它以XML连接,如下所示: 和 我认为我需要做的是: 但这给了我一个错误,如: 我做错了什么? 我认

  • 我遇到了将字节字符串转换为字节数组的强制转换问题。 我有一个字符串[B@1a758cb。也就是Base64加密的String的主String"Gunjan"。这里的解密我想把加密的字节串转换成字节[]。 但是String.get字节[]不适合我。String.getBytes[]给出字节String的字节数。 我该怎么做??我是否必须迭代字节字符串中的每个字符并将其转换为字节[]?? 编辑 我使用