具有最高位设置的位字面字节

时间:2016-05-11 07:15:26

标签: java

我与遗留系统进行交互,遗留系统在位级别上需要大量输入。它要求我传入具有特定位设置的八位字节(实际上是字节)。

为了保持这种可读性,我声明了一些这样的标志:

private static final byte FLAG_A   = 0b00010000;
private static final byte FLAG_B   = 0b00100000;
private static final byte FLAG_C   = 0b00011000;

完美无缺。

奇怪的是,当我设置最高位(如下所示)时,编译器开始抱怨找到一个int。我可以把它扔掉,但这对我来说似乎很奇怪。它仍然是8位,所以我希望它适合一个字节(即使双补码符号导致它被解释为负数,这对我没有影响)

private static final byte FLAG_D   = 0b10000000;

知道发生了什么事吗?

4 个答案:

答案 0 :(得分:4)

0bxxxx表示法用于整数的逐位表示,如果它们适合,可以转换为字节,但这不是特殊的仅字节表示法。 0b1000000是正+128,这可以超过字节。您需要执行类似-0b111111(-127)的操作来实现字节模式0b1000000,但最好是进行显式转换。你真正需要的是无符号字节类型,这是java缺乏的。

答案 1 :(得分:1)

@Artur Biesiadowski停止的地方开始,你实际上是在尝试存储超过一个字节可以处理的内容。

 1    0    0    0    0    0    0    0
7th  6th  5th  4th  3rd  2nd  1st  0th

此值为+128; Java字节范围是-128到+127 [read further here]。

更清晰,更易读的方法可能是使用十六进制而不是0bxxx。

现在,由于您要求将+128存储在最多可存储+127的数据类型中,因此它会自动使用可以存储更大范围的数据类型,即int来自类型的进程推广。 [JLS 5.x]详细解释了这一点。

答案 2 :(得分:0)

另一种解决方案是使用BitSet及其更易读的方法。您仍然可以为各个位使用标志,但它们是索引而不是位掩码。然后,您可以使用BitSet.toByteArray()[0]检索生成的字节。

答案 3 :(得分:-3)

您可能希望将您的旗帜声明为

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/RLMain"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/img2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="left"
        android:layout_marginLeft="1dp"
        android:src="@mipmap/ic_launcher" />

    <ImageView
        android:id="@+id/img1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_gravity="right"
        android:layout_marginRight="30dp"
        android:layout_marginTop="30dp"
        android:src="@mipmap/ic_launcher" />

    <LinearLayout
        android:id="@+id/LL2"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_below="@+id/img1"
        android:layout_marginTop="5dp"
        android:orientation="horizontal">

        <Button
            android:id="@+id/button10"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_alignTop="@+id/button8"
            android:layout_marginRight="5dp"
            android:layout_weight="1"
            android:text="  Afspraak   maken" />


        <Button
            android:id="@+id/button8"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp"
            android:layout_weight="1"
            android:text="  Bezoek  tijden" />

        <Button
            android:id="@+id/button9"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginLeft="5dp"
            android:layout_weight="1"
            android:text="  Contact" />

    </LinearLayout>


    <LinearLayout
        android:id="@+id/LL3"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_below="@+id/LL2"
        android:layout_marginBottom="20dp"
        android:layout_marginTop="10dp"
        android:orientation="horizontal">

        <Button
            android:id="@+id/button3"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginRight="5dp"
            android:layout_weight="1"
            android:text="Route" />

        <Button
            android:id="@+id/button4"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp"
            android:layout_weight="1"
            android:text="Uw mening" />

        <Button
            android:id="@+id/button1"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_alignLeft="@+id/button5"
            android:layout_below="@+id/button8"
            android:layout_marginLeft="5dp"
            android:layout_weight="1"
            android:text="Word vriend" />

    </LinearLayout>


    <LinearLayout
        android:id="@+id/LL4"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_below="@+id/LL3"
        android:layout_marginTop="10dp"
        android:orientation="horizontal">

        <Button
            android:id="@+id/button5"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginRight="5dp"
            android:layout_weight="1.03"
            android:text="Folders" />

        <Button
            android:id="@+id/button6"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp"
            android:layout_weight="1"
            android:text="Specialisten" />

        <Button
            android:id="@+id/button7"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginLeft="5dp"
            android:layout_weight="0.97"
            android:text="Brandwond  encentrum" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/LL5"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_below="@+id/LL4"
        android:layout_marginTop="30dp"
        android:orientation="horizontal">

        <Button
            android:id="@+id/button2"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginLeft="0dp"
            android:layout_weight="1"
            android:text="Nieuws en Agenda" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/LL6"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_below="@+id/LL5"
        android:layout_marginBottom="40dp"
        android:layout_marginTop="30dp"
        android:orientation="horizontal">

        <Button
            android:id="@+id/button11"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginRight="5dp"
            android:layout_weight="1"
            android:text="Facebook" />

        <Button
            android:id="@+id/button12"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp"
            android:layout_weight="1"
            android:text="Youtube" />

        <Button
            android:id="@+id/button13"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_alignLeft="@+id/button5"
            android:layout_below="@+id/button8"
            android:layout_marginLeft="5dp"
            android:layout_weight="1"
            android:text="Twitter" />

        <Button
            android:id="@+id/button14"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_alignLeft="@+id/button5"
            android:layout_below="@+id/button8"
            android:layout_marginLeft="5dp"
            android:layout_weight="1"
            android:text="LinkedIn" />

    </LinearLayout>


</RelativeLayout>

我猜编译器认为255不符合有符号字节(只有-128到127)