java位操作问题

2019-03-25 13:44|来源: 网路

需要把一个4字节进行相关的位操作。先把字节数组转为long类型 然后所有的位操作都是用long类型 每一步位操作后都&0xff这样就保证了无符号8位,然后再把long转为byte。可是得出的结果仍然不对,不知道大家是怎么处理的。

问题补充:
gongxuxuxu 写道
通过位移啊..  int 到 bytes
32位 按 8个分割.然后降位来存到 当个byte中. 然后把4个byte放到数组...

public static void intwritetobytes(int intnumber, int startindex,
Byte... bytes) {
// 我们先把 intnumber 进行分位保存, 分成4位. 高位保存到数组的最前面.
bytes[startindex] = (byte) (intnumber >> 24);
bytes[startindex + 1] = (byte) (intnumber >> 16);
bytes[startindex + 2] = (byte) (intnumber >> ;
bytes[startindex + 3] = (byte) (intnumber >> 0);
}

放过来通过或来拼接. 这里注意下.先前的消位可能导致了你的数值丢失. 就是超过127的byte 变 负了. 不能还原. 所以你要通过 与运算来还原...
public static int getIntFrombytes(int startindex,Byte... bytes) {
// 我们先定义 一个int 数组.用于存放原始封装到byte中的int值.
int[] ints = new int[4];
ints[0] = bytes[0 + startindex] & 0x000000ff;
// 写这么多0 手痛.呵呵.删了啊.
ints[1] = bytes[1 + startindex] & 0xff;
ints[2] = bytes[2 + startindex] & 0xff;
ints[3] = bytes[3 + startindex] & 0xff;
// 然后我们把他们偏移了的位进行还原.再进行或运算.

return ints[0] << 24 | ints[1] << 16 | ints[2] << 8 | ints[3];

}


不止是int .sort long  都是一个道理..


非常感谢 我是把c++变成java c++里有无符号8位的
主要是我接受到这个4个字节就是byte数组 但是要对每一个字节做一些位运算 比如移位 抑或等等 我原来是把每一个byte都换成long了因为java中byte有符号位 然后每做一步位操作 就来个& 0xff 这样就保证了无符号的8位 然后把它还原成byte 但是得出的结果是错误的。不知道是在哪一步错了

问题补充:给你发过代码了



gongxuxuxu 写道
是一样的.
src[0]<<24 | src[1]<<16 | src[2] << 8 | src[3]);    你这样会自动转int升位的.
我是怕他看不懂 才故意分开的.

相关问答

更多
  • C语言是一种高级语言,但是其中包含一些汇编语言的特性,所以常被称为“中级语言”,位操作就是一个例子。 C语言中可以使用 操作符&(按位与)和 操作符 |(按位或) 等来进行位操作。
  • 从JLS第15.19节开始 : 如果左侧操作数的提升类型为int,则只有右侧操作数的五个最低位用作移位距离 。 就好像右边的操作数受掩码值为0x1f (0b11111)的按位逻辑AND运算符& (第15.22.1 0x1f (0b11111) 。 实际使用的换档距离总是在0 to 31的范围内。 强调我的。 所以: x >>> n 相当于: x >>> n & 0x1f // or x >>> n % 32 所以, x >>> 32相当于x >>> 32 & 0x1f <==> x >>> 0 == ...
  • 假设小端, (b[0] & 0xFF) | (b[1] & 0xFF) << 8 | (b[2] & 0xFF) << 16 | (b[3] & 0xFF) << 24 例如, http://www.ideone.com/p68zS & 0xFF在那里将签名字节转换为无符号... Assuming little-endian, (b[0] & 0xFF) | (b[1] & 0xFF) << 8 | (b[2] & 0xFF) << 16 | (b[3] & 0xFF) << 24 Example, h ...
  • 顾名思义, BigDecimal以十进制表示形式存储。 所以用2的幂分割的最快方法是......除以2的幂。 你可以左移和右移,但只能以10为底 (即使这样它的行为与位移不同,因为它可以产生非整数值)。 As the name suggests, a BigDecimal is stored in decimal representation. So the quickest way to divide by powers of 2 is ... to divide by powers of two. Yo ...
  • java有32位固定的int大小。 但是在python中没有明确定义的数字限制。 读取( 长整数的最大值 ) 针对您的问题的一个hacky解决方案(可能不适用于所有情况)是 return ans - 2**(32-1) java has 32-Bit fixed int size. But in python there is no explicitly defined limit for numbers. read at (Maximum value for long integer) A hacky ...
  • 你可以使用BigInteger and() : BigInteger first = new BigInteger("00100000000000010000010011101000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000",2); BigInteger second = new BigInteger("000000000000000000000000000 ...
  • 作为提示,尝试使用10以外的基数,因为计算机比小数更好地处理二进制算术。 x >>> n相当于x / 2 n x&(2 n -1)相当于x%2 n 顺便说一下,Java的>>执行符号扩展,在这种情况下可能不是你想要的。 请改用>>>。 As a hint, try using a radix other than 10, since computers handle binary arithmetic better than decimal. x >>> n is equivalent to x / 2n ...
  • 在C中,您可以使用按位运算符操作位,例如&和| ,以及bitshift运算符<<和>> 。 例如,要关闭给定字节的高位,就可以执行此操作。 char c = 0xBF; // initial value is bit pattern 10111111 c &= 0x7F; // perform AND against the bit pattern 01111111 // final value is bit pattern 00111111 (0x3F) 那有 ...
  • 您可以在两个int上应用^运算符,而不是在int和int数组上。 根据错误消息, Kc[n]是一个int数组。 您可以在两个int上应用运算符: r[temp1][n] = r[temp1][n]^Kc[temp1][n]; 我不知道索引是否有意义(因为我不知道2个数组的维度),所以你可能不得不改变它们。 You can apply the^ operator on two ints, not on an int and an int array. Based on the error message, ...
  • 不,我们不能在浮动中移位。 该操作只是翻转第31位(从第0位开始)。 你可以在java中做到这一点就好了。 int test(int uf) { return uf ^ (1 << 31); } 那是你的功能。 你遇到的问题不是设置那个位,它知道如果那个数字为负数,那么它实际上是一个大于该数字的数字0xBFFFFFFF。 只要你将int作为一个32位的序列处理,而不是在适当的时候检查它的值,你就可以了。 如果你想要32位给你一个正确的数字。 使用很长时间。 long test(int uf) { ...