gpt4 book ai didi

java - 交换字节的前 4 位和后半位

转载 作者:行者123 更新时间:2023-11-30 10:00:00 25 4
gpt4 key购买 nike

我需要切换一个字节的前半部分和后半部分:例如将 0011 0101 变为 0101 0011

我认为它可能会这样工作:例如,我有 1001 1100bitshiftleft 4 次并得到 1111 1001(因为如果第一位是 1,其他位也变成 1)我向右移 4 次,得到 1100 0000(字节的后半部分用 0 填充)我不想要 1111 10010000 1001 所以我做 0x00001111 & 1111 1001 (过滤前 4 位)来制作 1111 1001 到 0000 1001然后我把所有东西加起来:

0000 1001 + 1100 0000 = 1100 1001

我明白了:

bytes[i] = (byte) (( 0x00001111 & (bytes[i] >> 4)) + (bytes[i] << 4) );

here is one output: 11111111 to 00000001

我真的不明白为什么会这样,我知道二进制系统,我想我知道位移是如何工作的,但我无法解释这个。抱歉英语不好:)

最佳答案

请注意 >>> 操作,它会在没有符号扩展的情况下移动符号位,因此零位将填充在左侧。问题是它是一个整数运算。 >>> 的工作方式相同,只是它通过 int 进行符号扩展。

  int i = -1;
i >>>= 30;
System.out.println(i); // prints 3 as expected.

byte b = -1;
b >>>= 6;
System.out.printnln(b); // prints -1 ???

字节仍然是 -1,因为 byte b = -1 被移位,就好像它是一个 int 然后重新分配给一个字节。所以这个字节仍然是负数。要获得 3,您需要做一些看起来很奇怪的事情,如下所示。

   byte b = -1;
b >>>=30;
System.out.println(b); // prints 3

因此,要进行交换,您需要执行以下操作;


byte b = 0b10100110;
b = (byte)(((b>>>4)&0xF)|(b<<4));

0xF 掩码,屏蔽掉从整数转换回字节时遗留下来的那些挥之不去的高阶位。

关于java - 交换字节的前 4 位和后半位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58414593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com