Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logic 将两个整数作为一个整数传递_Logic_Xor - Fatal编程技术网

Logic 将两个整数作为一个整数传递

Logic 将两个整数作为一个整数传递,logic,xor,Logic,Xor,我有两个整数,我需要通过一个整数,然后得到两个整数的值 我正在考虑使用逻辑运算符(AND、OR、XOR等)。两个整数不能匹配一个整数,或者至少您无法恢复原来的两个整数。 但无论如何,如果两个原始整数被限定为一定数量的位,则可以(在伪码中): 第一个整数 或与 (第二个整数SHIFTLEFT(nOfBits)) 用于返回两个整数 用一个由nOfBitsOne表示的二进制数屏蔽合并的整数,然后获得第一个整数 按nofB移位tright是合并后的整数,然后返回第二个。好的@Felice是对的,但如果它

我有两个整数,我需要通过一个整数,然后得到两个整数的值


我正在考虑使用逻辑运算符(AND、OR、XOR等)。

两个整数不能匹配一个整数,或者至少您无法恢复原来的两个整数。
但无论如何,如果两个原始整数被限定为一定数量的位,则可以(在伪码中): 第一个整数 或与 (第二个整数SHIFTLEFT(nOfBits))

用于返回两个整数 用一个由nOfBitsOne表示的二进制数屏蔽合并的整数,然后获得第一个整数
按nofB移位tright是合并后的整数,然后返回第二个。

好的@Felice是对的,但如果它们都适合16位,那么有一种方法:

output_int = (first_int << 16) | second_int
                               ^
                           means 'or'

您可以在32位整数中存储2个16位整数。第一个是16个第一位,第二个是最后16位。要检索和合成值,请使用移位运算符。

使用C编程语言,可以按如下方式执行,假设两个整数小于65535

void take2IntegersAsOne(int x)
{
   // int1 is stored in the bottom half of x, so take just that part.
   int int1 = x & 0xFFFF;  

   // int2 is stored in the top half of x, so slide that part of the number
   // into the bottom half, and take just that part.
   int int2 = (x >> 16) & 0xFFFF

   // use int1 and int2 here. They must both be less than 0xFFFF or 65535 in decimal

}


void pass2()
{
  int int1 = 345;
  int int2 = 2342;
  take2Integers( int1 | (int2 << 16) );
}
void take2IntegersAsOne(int x)
{
//int1存储在x的下半部分,所以只取该部分。
int int1=x&0xFFFF;
//int2存储在x的上半部分,因此请滑动数字的该部分
//进入下半部分,只取那一部分。
int2=(x>>16)和0xFFFF
//在此处使用int1和int2。它们的十进制数必须都小于0xFFFF或65535
}
无效密码2()
{
int1=345;
int2=2342;
take2Integers(int1 |)(int2用于上下滑动整数的位。移位16,将位移动两个字节(因为每个字节有8位)


使用0xFFFF表示位模式,其中数字的下两个字节中的所有位都是1s,因此,ANDIN(使用with&operator)导致不在下两个字节中的所有位关闭(返回零)。这可用于从当前提取的整数中删除“其他整数”的任何部分。

此问题有两个部分。首先,如何将两个32位整数位掩码为64位长的整数?

正如其他人所说,假设我有一个函数,它采用X和Y坐标,并返回一个表示该点线性值的长函数。我倾向于将这种2d数据的线性化称为:

public long asLong(int x, int y) {
    return ( ((long)x) << 32 ) | y;
}

public int getX(long location) {
    return (int)((location >> 32) & 0xFFFFFFFF);
}

public int getY(long location) {
    return (int)(location & 0xFFFFFFFF);
}
这种方法很早以前就出现了,在需要从存储或传输空间中挤出每一位的环境中。如果您不在嵌入式系统上,或者不立即打包这些数据以便通过网络传输,那么整个过程的实用性很快就开始崩溃:

  • 仅仅装箱一个返回值就太麻烦了,调用方几乎总是需要立即解除装箱并读取返回值。这有点像挖一个洞然后填充它
  • 它大大降低了代码的可读性。“返回的是什么类型?”呃…一个int…和另一个int…在很长的一段时间内
  • 它可能会引入难以追踪的bug。例如,如果您使用无符号类型并忽略符号扩展,那么稍后将迁移到一个平台,从而导致这些类型成为两个补码。如果您保存longint,并尝试稍后在代码的另一部分中读取它,则可能会在bitshift和s上出现一个接一个的错误花一个小时调试你的函数,结果发现是参数错了
如果情况如此糟糕,有什么选择?

这就是为什么人们问你你的语言的原因。理想情况下,如果你在C或C++中,最好是说< /P>
struct Point { int x; int y; };

public Point getPosition() {
    struct Point result = { 14,5 };
    return result;
}
否则,在类似Java的HLL中,您可能会使用一个内部类来实现相同的功能:

public class Example {
    public class Point {
        public int x;
        public int y;
        public Point(int x, int y) { this.x=x; this.y=y; }
    }

    public Point getPosition() {
        return new Point(14,5);
    }
}
在本例中,getPosition返回一个Example.Point-如果您经常使用Point,请将其升级为自己的完整类。事实上,java.awt已经有几个Point类,包括Point和Point.Float

最后,许多现代语言现在都有语法糖,可以将多个值装箱到元组中,也可以直接从函数返回多个值。这是最后的手段。根据我的经验,任何时候你假装数据不是真实的数据,你最终都会遇到问题。但是如果你的方法绝对必须返回两个numb实际上根本不是同一数据的一部分,元组或数组才是最好的选择

C++中的STDLIB元组的引用可以在


传递是什么意思?你能举一个更好的例子吗?两个原始整数的长度是多少位?你使用的是什么编程语言?以及你想传递的两个整数的最大值是多少。每个原始整数值都有一个最大值吗?我喜欢这个解决方案,但我不能同意data@Mohammed:使用长整数可能会对你有所帮助。从我发表评论之日起,移位32位,答案是错误的。具体来说,在提取它们时,第一个整数和第二个整数互相引用。两个整数实际上可以“拟合”这是因为有序整数对集合的基数等于整数的基数。也就是说,整数的数量与有序整数对的数量相同。如其他海报所指出的,如果您知道有多少位,您可以通过位掩码来实现。您还可以使用类似
p = 229    : 1110 0101  
x = p >> 4 : 1111 1110  //depending on your language and data type, sign extension
                        //can cause the bits to smear on the left side as they're
                        //shifted, as shown here. Doesn't happen in unsigned types
x = x & 0xF:
             1111 1110
         AND 0000 1111
         -------------
             0000 1110  //AND selects only the bits we have in common

y = p & 0xF:
             1110 0101
         AND 0000 1111
         -------------
             0000 0101  //AND strikes again
struct Point { int x; int y; };

public Point getPosition() {
    struct Point result = { 14,5 };
    return result;
}
public class Example {
    public class Point {
        public int x;
        public int y;
        public Point(int x, int y) { this.x=x; this.y=y; }
    }

    public Point getPosition() {
        return new Point(14,5);
    }
}