如何在Java中将int转换为三个字节?

时间:2008-10-09 02:45:40

标签: java bit-manipulation byte bit-shift

我正在尝试将int转换为三个代表bytes(大端)的int

我确定它与逐位和位移有关。但我不知道该怎么做。

例如:

int myInt;

// some code

byte b1, b2 , b3; // b1 is most significant, then b2 then b3.

*注意,我知道int是4个字节,三个字节有可能上溢/下溢。

5 个答案:

答案 0 :(得分:14)

获得最不重要的字节:

b3 = myInt & 0xFF;

第二个最低有效字节:

b2 = (myInt >> 8) & 0xFF;

第三个最不重要的字节:

b1 = (myInt >> 16) & 0xFF;

<强>解释

使用0xFF(二进制11111111)对值进行按位与运算将返回该数字中的最低有效8位(位0到7)。将数字向右移动8次将位8到15放入位0到7,因此与0xFF进行AND运算将返回第二个字节。类似地,将数字向右移动16次会将位16到23置于位0到7中,因此与0xFF进行AND运算会返回第3个字节。

答案 1 :(得分:4)

byte b1 = (myint >> 16) & 0xff;
byte b2 = (myint >> 8) & 0xff;
byte b3 = myint & 0xff;

我不确定这在java中如何,但我不是一个java dev

答案 2 :(得分:2)

int不适合3个字节。但是,假设您知道这些特定的:

   byte b1 = (myInt & 0xff);
   myInt >>= 8;
   byte b2 = (myInt & 0xff);
   myInt >>= 8;
   byte b3 = (myInt & 0xff);

答案 3 :(得分:1)

在Java中

int myInt = 1;
byte b1,b2,b3;
b3 = (byte)(myInt & 0xFF);
b2 = (byte)((myInt >> 8) & 0xFF);
b1 = (byte)((myInt >> 16) & 0xFF);
System.out.println(b1+" "+b2+" "+b3);

输出 0 0 1

答案 4 :(得分:0)

对于正整数值,Jeremy的答案是正确的。如果转换对于负值应该是正确的,则由于二进制补码格式(https://en.wikipedia.org/wiki/Two%27s_complement),所以转换要复杂得多。技巧是消除感兴趣的位(较低有效位)和“符号”位之间的间隙。一种简单的方法是将数字相乘。

import { timer, of, BehaviorSubject, interval } from 'rxjs';
import { tap, mapTo, share, shareReplay, } from 'rxjs/operators';

const source$ = timer(1000)
.pipe(
  tap((v) => console.log('SIDE EFFECT')),
  mapTo('RESULT')
)
const sharedSource$ = source$.pipe(share());
// or shareReplay(1) if you want to ensure every subscriber get the last value event if they will subscribe later;

sharedSource$.subscribe(console.log);
sharedSource$.subscribe(console.log);
sharedSource$.subscribe(console.log);
sharedSource$.subscribe(console.log);
sharedSource$.subscribe(console.log);
sharedSource$.subscribe(console.log);
sharedSource$.subscribe(console.log);

这将以正确的二进制补码格式表示负值。

PS:您可以通过以下方式检查和比较二进制表示形式:

    int myIntMultiplied = myInt * 256;

    byte b1, b2, b3;

    b3 = (byte) ((myIntMultiplied >> 8) & 0xFF);
    b2 = (byte) ((myIntMultiplied >> 16) & 0xFF);
    b1 = (byte) ((myIntMultiplied >> 24) & 0xFF);