繁体   English   中英

Java中的按位运算符作用于两个字节

[英]Bitwise operators in Java acting on two bytes

这应该很简单但是我在更改一些使用按位运算符并转换为Java的C代码时遇到了麻烦。

CI中有:

unsigned short Color(byte r, byte g, byte b)
{
  return( ((unsigned short)g & 0x1F )<<10 | ((unsigned short)b & 0x1F)<<5 | (unsigned short)r & 0x1F);
}

此功能Color返回16位,其中15个代表红色,绿色和蓝色通道的三个5位值。 我正在尝试用Java做类似的事情,除非我遇到数据类型问题。

在java我有:

int r=someval, g=anotherval, b=yetanotherval;

我想将这些整数转换为2字节数据类型,并使用与上面相同的按位/移位操作。

解决这个问题的最佳方法是什么? 我在考虑一个2字节的数组,但这似乎没必要。

编辑

所以我用Java来尝试使用短片,但似乎仍有问题。 我开始简单:

short r=someval, g=anotherval, b=yetanotherval;
short colorData = g & 0x001F;

但编译器抱怨:“无法从int转换为short”

你也有Java中的short类型,但它总是签名,Java中没有unsigned。

因此,使用int可能更好,因此您不需要使用符号位来保存实际的颜色数据,这可能有点混乱(没有双关语!)令人困惑。

这应该作为一个起点,至少:

int Color(int r, int g, int b)
{
  return ((g & 0x1F) << 10) | ((b & 0x1F) << 5) | (r & 0x1F);
}

为简单起见,我也将参数设为int

更新:它听起来(似乎)好像你可以实际使用short ,因为你只需要15位的颜色格式。 然后让我们这样做:

short Color(short r, short g, short b)
{
  return ((g & 0x1F) << 10) | ((b & 0x1F) << 5) | (r & 0x1F);
}

我没有尝试过编译上面的内容,但很可能你会得到转换错误,并且需要在整个过程中添加显式的short脚本以使其编译。

在java中,所有计算操作,即使只有小于int的类型,总是会产生一个int,所以你必须显式地将它强制转换为short:

short colorData = (short)(g & 0x001F);

在你的例子中

short r=someval, g=anotherval, b=yetanotherval;
short colorData = g & 0x001F;

g和hex文字都会自动提升为int因为逻辑和运算符总是处理并返回整数。 你当然可以把结果short

short colorData = (short)(g & 0x001F);

这应该适用于char数据类型,它实际上是JVM上唯一的无符号整数类型。 我建议不要以这种方式使用char类型,除非这是程序中隔离的性能/内存敏感部分,因为使用char进行算术可能看起来很奇怪并且对于源的其他维护者来说是违反直觉的。

char:char数据类型是一个16位Unicode字符。 它的最小值为'\\ u0000'(或0),最大值为'\\ uffff'(或65,535(含))。

http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

默认情况下,Java char数据类型为2个字节。

由于您仅使用15位,因此short数据类型上的符号位将没有问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM