在c ++中使用AND短路

时间:2009-11-28 14:24:11

标签: c++

我如何编写一段代码来判断短信的第一个字节,而不是第二个字节?

Eaxmple: 我有一个名为inputShort的short,我希望这个简短的删除第二个字节中的所有值。所以我想和逻辑运算符一起使用它。

好吧,我试过了,但我失败了。那么有人能给我一个如何做到这一点的例子吗?

我的目标是保留短片的左侧部分,并清空短片的右侧部分。

6 个答案:

答案 0 :(得分:7)

当你说“第二个字节”时,我不知道你的意思是最重要还是最不重要,但这里有一个可能有帮助的例子。

short second = 0xFF00;
short first = 0x00FF;
short number = 0x1234;
short tmp;

tmp = number & first; //tmp is set to 0x1234&0x00FF -> 0x0034
tmp = number & second; //tmp is set to 0x1234&0xFF00 -> 0x1200

答案 1 :(得分:7)

“第一”和“第二”是模棱两可的。他们倾向于提到存储,所以endian-ness发挥作用,我认为你不是那个意思。短路中的字节数也是实现定义的。

我假设您要将最低有效位(“右”)置零,并保留所有其他位:

#include <limits>

...

inputShort & ~std::numeric_limits<unsigned char>::max();

或者,如果你感到勇敢,并且你想假设8位字节:

inputShort & ~0xFF;

(假设8位字节不需要太多勇气)。

答案 2 :(得分:3)

很简单:res = inputShort & 0xff00

如果您愿意,也可以使用>>将第二个字节转换为低位字节:

unsigned short res = (inputShort & 0xff00) >> 8

答案 3 :(得分:2)

假设16位short s:

#include<stdio.h>

int main(void) {
    unsigned short val = 0xbaba;
    unsigned short mask = 0xff00;
    unsigned short result = val & mask;
    printf("%04x\n", result);
    return 0;
}

输出:

E:\tmp> t
ba00

答案 4 :(得分:0)

好的,我写了这个方法:

short Game::swapShort(short inputShort)
{
    short tempA;
    short tempB;

    tempA = ((inputShort & 0xff00) >> 8);
    tempB = ((inputShort & 0x00ff) << 8);

    short total = tempA + tempB;
    return total;
}

我认为应该正常工作。

但是,我的inputShort将成为我程序中的指针。有人也可以向我解释我如何调整我的方法来使用短指针吗? :$

答案 5 :(得分:0)

回应Krunk上面的评论: 首先,您可能想要这样做:

short total = tempA | tempB; 

你在逻辑上尝试OR它们,而不是添加它们。如果你想用inputShort作为指针来做这件事,那就很容易了,但是你也可以使用引用代替,所以你不必乱用dereferencing指针。此外,在处理签名类型时,必须小心自动符号扩展。如果你正在对具有最高位设置的值进行右移,那么你正在处理负数的移位..那么,让我给你一个例子:

short foo = -5;

我们现在假设16位短路。 在二进制补码二进制中

1111 1111 1111 1011

如果我们将它右移1,我们就会得到:

1111 1111 1111 1101

由于符号扩展,左侧的额外1是那里。 因此,让我们使用您的代码遍历字节交换-5:

tempA =((1111 1111 1111 1011)&amp; 0xff00)&gt;&gt; 8 所以,操作首先给了我们:

1111 1111 0000 0000

然后右移给我们:

1111 1111 1111 1111

这显然不是你想要的。

你可以这样做的一种方法就是使用重新解释。我假设您对swapShort的输入是短而不是无符号短路的原因?无论如何,我会把它留作简短的:

//我继续修改它以取一个短指针,就像Krunk问道。 //还要注意我们假设是16位短路。这种情况会在不存在这种情况的平台上中断。

void Game::swapShort(short *inputShort)
{
    //Once we start treating it as unsigned, don't have to worry about sign extension.
    unsigned short* tmp = (reinterpret_cast<unsigned short*>(inputShort);

    unsigned short highByte = ((*tmp & 0xff00) >> 8)
    *tmp = highByte | ((*tmp & 0x00ff) << 8);

}

或者,如果您真正尝试做的只是以网络字节顺序获取,有一种更简单的方法,您可以使用htons和ntohs:

一个例子是:

unsigned short foo = 300;
//htons = host to network short
unsigned short foo_net_byte_order = htons(foo);

使用htons及其等价物的好处是,如果你在大端系统上运行代码,htons&amp; amp; ntohl基本上是无操作的,但它实际上会在一个小端系统上交换它们。也就是说,在确定是否需要交换之前,您不必弄清楚正在运行的系统的字节顺序。 htons知道网络字节顺序意味着什么以及你的主机字节顺序是什么,它只会为你处理它。长期也有等价物。见http://msdn.microsoft.com/en-us/library/ms738557%28VS.85%29.aspx

POSIX类型的操作系统也存在相同的功能,但您必须包含一组不同的标题。