连接两个整数的二进制表示

6
假设我们有两个 int 变量,AB,它们的位长分别为 N < 16M < 16。 我们想要一个新的 int 变量 C,其中 N 个最低有效位包含 A 的位,接下来的 M 个位包含 B 的位。(假设所有变量都是32位长且采用小端字节序)。
在我的解决方案中,我稍微作弊了一下,使用了二进制字符串:
int a = 65535;
int b = 65;
String cStr = Integer.toBinaryString(b) + Integer.toBinaryString(a);
int c = Integer.parseInt(cStr, 2);

但是,如何使用位运算符来完成呢?

示例:

A=1,B=1(N=1,M=1相应),则C = 11 A = 11000011010100,B = 101100(N=14,M=6相应),则C = 10110011000011010100


好的,那么你真的只想考虑设置为1的位吗?这意味着你将无法将a和b取回,因为你不知道边界在哪里。 - rghome
你好!欢迎来到StackOverflow!我建议您通过提供预期输出来改进您的问题。我不完全确定您的代码是否解决了您描述的问题(例如,没有NM)。此外,如果您可以展示一种尝试使用位运算符的解决方案,对您会更有益。 - norok2
假设 ab 都是 1,你想要的结果是 3 吗? - user85421
@norok2 你好!已按建议添加了示例。 - Jill White
2个回答

7

在Java中:

c = b << 16 | a;

但是如果你想要按照确切的位数进行移位:

c = b << (32 - Integer.numberOfLeadingZeros(a)) | a;

Integer.highestOneBit() 不会返回传递参数中最高位设置的位置。请仔细阅读文档。例如,将20作为参数传递时,它返回16而不是4。 - Robert Kock
是的 - 在你完成评论之前我已经修复了它。对于最初的错误感到抱歉。 - rghome
第二个解决方案正是我所寻找的。 - Jill White
5
注意,由于移位运算符的工作方式,您无需指定 32,即您可以简单地使用 c = b << -Integer.numberOfLeadingZeros(a) | a; - Holger

-1

尝试这个并检查是否有相同的值。我不确定在Java中会是什么样子,但这适用于C++和C#。 int c = b << 16 | a;

首先,您应该计算要将b移动多少位。所以:

int a = 65535;
int count = 0;
int temp = a;
while(temp != 0)
{
  ++count;
  temp = temp >> 1;
}

int b = 65;
int c = b << count | a;

虽然因为您的声望较低而无法发表评论是可以理解的,但这并不是将答案用作评论的理由。和其他人一样,您需要等待直到获得足够的声望才能进行评论。您可以删除此帖子,谢谢。 - azro
这总是为A的值保留16位。它应该连接这些位,即使A占用少于16位。 - Robert Kock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接