十六进制:在int中设置一个8位字节

时间:2015-09-02 03:43:03

标签: java integer bitwise-operators bitmask 8-bit

在Java中:

我有一个以十六进制形式给我的32位数字。我给了一个特定的字节数(0-3,0表示最低有效字节),并告诉我需要用另一个以十六进制形式给我的字节替换该字节。例如:32位数字0xAAA5BBC6,用0x17替换字节1得到0xAAA517C6。

我不能使用任何施法,乘法,加法,减法或条件。我无法编写任何帮助器方法,或从此文件或其他文件调用任何其他方法来实现任何方法。此外,这必须用一行代码编写。

我相信我应该使用遮蔽,但我无法弄清楚从哪里开始。给定一个字节数,如何更改所有8位。关闭或打开一个很容易,但将所有8位切换为特定值?

3 个答案:

答案 0 :(得分:0)

如何创建一个方法(或类构造函数),其目的是专门分析十六进制值并将其转换为您想要的数据类型。 我强烈建议您阅读有关数据转换的信息或在YouTube上观看有关它的视频,并了解它与您的案例有何关联。 祝你好运! - 最大

答案 1 :(得分:0)

看看下面的例子:

input   =    AA      A5         BB      C6  (in hex)
input   = 10101010 10100101 10111011 11000110 (in binary)
mask    =    FF       FF       00       FF  (in hex)
mask    = 11111111 11111111 00000000 11111111 (in binary) 
-------------------------------------------------------
input   = 10101010 10100101 00000000 11000110 (bitwise AND)
replace =    FF       FF       17       FF  (in hex)
replace = 11111111 11111111 00010111 11111111 (in binary) 
-------------------------------------------------------
input   = 10101010 10100101 00010111 11000110 (bitwise OR)
input   =    AA      A5         17      C6  (in hex)

最后一行是您想要的输出。如您所见,有两个按位运算AND and OR。你必须研究那些很多才能知道这项工作。

答案 2 :(得分:0)

在一行中,假设从最不重要的字节计数字节:

int updatedValue = originalValue & ~(0xFF << (byteNumber << 3)) | ((((int)newByte) & 0xFF) << (byteNumber << 3));

其中:
originalValue是您原来的32位整数
newByte是您用来替换旧字节的字节 byteNumber是字节数(0-3)

代码的作用如下:

  • 创建一个掩码&#34;删除&#34;旧字节(清除此字节的位)。为了创建蒙版:

    • 创建所有位集的字节掩码(全部为1)0xFF
    • 将此掩码偏移到要删除的字节的位置&#34;,它必须是要删除的字节数的8倍&#34;。由于我无法乘法(部分限制),然后我向左偏移这个3位(相当于乘以8,记住将位置向左移位是等于乘以2 ,所以偏移3将是2 * 2 * 2 = 8)这是由这段代码完成的:(byteNumber << 3)
    • &#34;肘节&#34;带有~的掩码位,所以我有掩码去&#34;删除&#34;字节:~(0xFF << (byteNumber << 3))此时您将屏蔽,如果要清除字节#1,则说FFFF00FF
  • 在原始编号和第一步中创建的掩码之间执行按位操作:~(0xFF << (byteNumber << 3))

  • 使用新字节创建一个32位整数,并将其位偏移到字节的位置。同样,偏移是使用已经解释过的(byteNumber << 3)完成的。
  • 执行或按位操作,第二步的结果设置新字节的位(这是代码行,最后一步)

现在,我执行((int)newByte) & 0xFF)而不仅仅是((int)newByte))或仅newByte的原因是JVM向int运营商byte提升<< {1}}在执行操作0x80之前,如果你的newByte大于0x7F,这可能会产生不良影响(例如,int的值将0xFFFFFF80强制转换为0x00000080 ((int)newByte) & 0xFF) 1}}而不是int)。通过<LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="What are you interested in?" android:gravity="center" android:layout_gravity="center_horizontal" /> <LinearLayout android:gravity="center" android:padding="5px" android:layout_width="match_parent" android:layout_margin="10dp" android:layout_height="wrap_content"> <ImageButton android:layout_height="100dp" android:layout_width="100dp" android:layout_margin="10dp" android:background="@drawable/education" android:id="@+id/imageButton" /> <ImageButton android:layout_height="100dp" android:layout_width="100dp" android:layout_margin="10dp" android:background="@drawable/icon" android:id="@+id/imageButton2" /> <ImageButton android:layout_height="100dp" android:layout_width="100dp" android:layout_margin="10dp" android:background="@drawable/icon" android:id="@+id/imageButton3" /> <ImageButton android:layout_height="100dp" android:layout_width="100dp" android:layout_margin="10dp" android:background="@drawable/icon" android:id="@+id/imageButton4" /> </LinearLayout> </LinearLayout> 我自己升级到var x = { y: 0 }; var z = 5; function addStrokesToScore(a, b) { a.y += b; } addStrokesToScore(x, z); console.log(x.y); 并清除不需要的位以防万一。