java位操作问题

问题描述

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

解决方案

兄弟 .把你写的java代码给我. 然后把c++传入的byte数组给偶
解决方案二:
是一样的. src[0]<<24 | src[1]<<16 | src[2] << 8 | src[3]); 你这样会自动转int升位的.我是怕他看不懂 才故意分开的.
解决方案三:
没有必要。直接进行字节类型的位操作就行。 public static byte[] int2Bytes(int a) { byte[] res = new byte[4]; res[0] = (byte)(a>>24); res[1] = (byte)(a>>16); res[2] = (byte)(a>>8); res[3] = (byte)a; return res; } public static int bytes2Int(byte[] src) { return (src[0]<<24 | src[1]<<16 | src[2] << 8 | src[3]); }
解决方案四:
public static void longwritetobytes(long intnumber, int startindex,Byte... bytes) {bytes[startindex] = (byte) (intnumber >> 56);bytes[startindex + 1] = (byte) (intnumber >> 48);bytes[startindex + 2] = (byte) (intnumber >> 40);bytes[startindex + 3] = (byte) (intnumber >> 32);bytes[startindex + 4] = (byte) (intnumber >> 24);bytes[startindex + 5] = (byte) (intnumber >> 16);bytes[startindex + 6] = (byte) (intnumber >>;bytes[startindex + 7] = (byte) (intnumber >> 0);}public static long getLongFrombytes(int startindex, Byte... bytes) {long[] longs = new long[8];longs[0] = bytes[startindex] & 0x00000000000000ff;longs[1] = bytes[1 + startindex] & 0xff;longs[2] = bytes[2 + startindex] & 0xff;longs[3] = bytes[3 + startindex] & 0xff;longs[4] = bytes[4 + startindex] & 0xff;longs[5] = bytes[5 + startindex] & 0xff;longs[6] = bytes[6 + startindex] & 0xff;longs[7] = bytes[7 + startindex] & 0xff;return longs[0] << 56 | longs[1] << 48 | longs[2] << 40| longs[3] << 32 | longs[4] << 24 | longs[5] << 16| longs[6] << 8 | longs[7];}
解决方案五:
通过位移啊.. 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 都是一个道理..

时间: 2024-11-01 01:34:45

java位操作问题的相关文章

java位操作

Java中的位操作指定包括: ~ 按位非(NOT) & 按位与(AND) | 按位或(OR) ^ 按位异或(XOR) >> 右移 >>> 无符号右移 <<左移 前面几个都非常简单,主要是移位操作比较容易出错. 首先要搞清楚参与运算的数的位数,如int的是32位.long的是64位. 如int i = 1; i的二进制原码表示为: 00000000000000000000000000000001 long l = 1; l的二进制原码表示为: 0000000

jcom-利用Jcom在用java程序中调用windows Com组件,Jcom.dll是不是支持64位操作系统?

问题描述 利用Jcom在用java程序中调用windows Com组件,Jcom.dll是不是支持64位操作系统? 利用Jcom在用java程序中调用windows Com组件,Jcom.dll是不是支持64位操作系统?我发现在32位机器上是可以调用成功的,为什么切换到64为机器上就调用不成功,有谁了解这个Jcom的,谢谢给个解答.

Java 中位操作的详解

<1>.在了解位移之前,先了解一下正数和负数的二进制表示形式以及关系: 举例15和-15: 15 的原码: 00000000 00000000 00000000 00001111     补码: 11111111 11111111 11111111 11110000                  +1 = -15的原码:11111111 11111111 11111111 11110001 负数的原码即为:正数的原码取反,再加1. <2>位移操作:(只针对 int类型的数据有效

Linux 64位操作系统安装配置java

一.下载jdk http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 二. 安装 在/usr下新建java文件夹,将安装包放在/usr/java目录下 # mkdir /usr/java 文件安装 //  # chmod 777 jdk-1_5_0_14-linux-i586-rpm.bin    ← 修改为可执行 //   # ./jdk-1_5_0_14-linux-i586-r

MD5的Java Bean实现

MD5简介 MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2.MD3和MD4发展而来. Message-Digest泛指字节串(Message)的Hash变换,就是把一个任意长度的字节串变换成一定长的大整数.请注意我使用了"字节串"而不是"字符串"这个词,是因为这种变换只与字节的值有关,与字符集或编码方式无关. MD5将任意长度的"字节串&q

JAVA程序员必读:基础篇(3)语言基础

程序|程序员 我们先看看一个具体例子,给你们有个先入为主的感觉.以下是一个BasicsDemo程序,它的作用是从1加到10,并显示结果: public class BasicsDemo { public static void main(String[] args) { int sum = 0; for (int current = 1; current <= 10; current++) { sum += current; } System.out.println("Sum = &quo

JAVA程序员必读:基础篇(4)类和继承

程序|程序员|继承 这节教程将开始讨论对象的生命周期.包括怎样创建对象.怎样使用它以及在不使用它的时候将它从系统中清除.下面一个一个介绍:4.1 对象的生命周期 在这一小节中你可以学到怎样创建和使用任何类型的对象,还讨论了当对象不再需要的时候系统怎样清除对象的. 典型的JAVA程序创建对象,对象之间的交互是通过发送消息来实现的.通过这些对象的交互,JAVA程序可以执行一个GUI.运行一个动画或者通过网络发送和接收信息.一旦对象已经完成了任务,它就被作为无用信息被回收,它的资源可以由其它对象回收利

心得总结:Java性能优化技巧集锦

技巧|心得|性能|优化 一.通用篇 "通用篇"讨论的问题适合于大多数Java应用. 1.1 不用new关键词创建类的实例 用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用.但如果一个对象实现了Cloneable接口,我们可以调用它的clone()方法.clone()方法不会调用任何类构造函数. 在使用设计模式(Design Pattern)的场合,如果用Factory模式创建对象,则改用clone()方法创建新的对象实例非常简单.例如,下面是Factory模式的一

java初学者要搞清

初学 1.实例方法,类方法,构造器方法 我们通常所说的方法系指实例方法,就像c语言中的函数一样,其具体方法我就不用说了,在这里我主要是用它来区分类方法和构造器方法.类方法与实例方法最大的区别是:在形式上类方法多一个static,在用法上, 不必创建对象就可直接调用类方法(而实例方法却一定要先创建对象,再通过对象调用). eg: class add { static int addem(int op1,int op2) { return op1+op2; } } public class xxf