【问题标题】:Bitwise Operators and Binary string evaluations位运算符和二进制字符串求值
【发布时间】:2012-09-25 09:16:05
【问题描述】:

我有一个任务,我必须将十六进制转换为 16 位二进制字符串,然后使用按位运算符比较其中两个。我有一个 for 循环,它对字符串生成器字符串执行 a.charAt[i]b.charAt[i]。现在,我希望它输出一个二进制数,但我已经达到了每次执行该行时,它给我的数字不是 0 或 1。它给了我 2 个数字(2 和 3)。我做错了什么?

一些代码:

    int bin = 0;
    hex = hex.replaceFirst("0x", "");
    bin = Integer.parseInt(hex, 16);
    hex = String.format("%16s", Integer.toBinaryString(bin));
    return hex;

我要评估的两个十六进制数是FFF70001。我已经成功地将它们转换为二进制字符串。我也不知道为什么,但是前面的零没有出现,只有空格:/

我已经在网上广泛搜索了几个小时,但似乎找不到我遇到的问题。

【问题讨论】:

  • 您应该包含您的代码。它有帮助。
  • & 这样的二元运算同时对两个数字的所有位进行操作,而不是对它们各自的位进行操作。这就是为什么x & y 的结果可能不是01 的原因。

标签: java binary bit-manipulation hex


【解决方案1】:

我假设您想将两个 16 位、大端、十六进制数字按位与在一起,并将结果显示为二进制。

正如其他人所说,使用数字而不是字符串会让您的生活更轻松 - 除非这是分配的约束?

如果我正在执行这项任务,并根据我的假设和理解,我会:

  • 将字符串转换为数字
  • 对于数字的每一位,从0x80000x0001(包括0x0001):
    • &对应位
    • 将结果附加到StringBuilder
  • 返回StringBuilder的内容

要逐步遍历每个数字的相应位,我将使用 bit maskingbit shifting

注意0x8000 是 16 位数字的最高位。

另一种方法是让 Java 做很多事情,但这可能不是您分配的重点:

final int a = Integer.parseInt("FFF7", 16); // 0b1111111111110111
final int b = Integer.parseInt("0001", 16); // 0b0000000000000001

final int result = a & b;

final String output = String.format("%16s", 
    Integer.toBinaryString(result)).replace(' ', '0');

System.out.println(output); 

这将打印:

0000000000000001

我希望这在某种程度上有所帮助,并且我的假设不会离题太远。祝你好运!

【讨论】:

    【解决方案2】:

    我认为您应该查看Integer.parseInt() 将您的十六进制字符串转换为整数。一旦你有了一个数字表示,那么你的二进制操作就会容易得多。

    如果您确实需要字符串二进制表示,请查看Integer.toBinaryString()

    【讨论】:

    • 我怀疑他需要添加到 StringBuilder 类似 sb.append((char) Integer.parseInt(n, 16)));
    • @Brian 我确实使用 Integer.parseInt() 将十六进制转换为整数,但后来我使用 Integer.toBinaryString() 来获取它们的二进制代码。现在我想不出一种方法来对两个字符串执行双向 & 操作,除了我拥有它的方式显然不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多