您的位置:首页 - 教程 - C++ - 正文
c/c++运算符

1.算术运算符(+  -  /  *  %)

2.移位运算符

移运算符:操作数必须是整形,>>,逻辑左移左边移入的位用0填充,算数左移左边移入的的位用符号位补齐。(无符号数为逻辑左移,对于有符号数取决于编辑器)

                                       <<,值左边的几位被丢弃,右边的多出来的几个空位用0补齐。

例:返回参数中1的个数

int SumOfOne(int num)
{
	int count = 0;
         for (int i = 0; i < 32; i++)
	{
if (num &1) count++; num >>= 1; } return count; }

 3、位操作符(&  |  ^)

将指定位(bit_number)置1

value=value|1<<bit_number;

将指定位(bit_number)置1

value=value&~(1<<bit_number)

4、赋值,复合赋值运算符(=,+=,-=,*=,%=,......)

5、单目运算符(只接受一个操作数)(!,++,-,&,sizeof,~,--,*,(类型))

6、关系运算符(>,>=,<,<=,!=,==)

7、逻辑运算符(&&,||)

a>5&&a<10 (&&的优先级比>和<的优先级低所以组合方式为(a>5)&&(a<10 )但尽管&&的优先级较低但它还会对两个表达式加以控制只有左操作数为真时才对右操作数进行操作)

操作符的一些应用:

判断一个数是不是2的n次方

bool IsPowOfTwo(int num)
{
    if (!(num&num - 1))
        return 1;
    return 0;
}

定义宏实现将一个int型的数的奇偶位互换

#define M(n) (((n>>1)0x55555555)|(n<<1)&0xaaaaaaaa)

将一个二进制序列逆序

int Reverse(int num)
{
    int ret = 0;
    for (int i = 0; i < 32; i++)
    {
        ret <<= 1;
        ret|= (num >> i) & 1;
    }
    return ret;
}

找出一组数中唯一的出现一次的数

int FindOneCount(int *a, int size)
{
    int xor = 0;
    for (int i = 0; i < size; i++)
    {
        xor = xor^a[i];
    }
    return xor;

}

找出只出现一次的两个数,其他的都是成对出现的

void FindTwoCount(int *a, int size,int *p1,int *p2)
{
    int tmp = 0;
    int xor = 0;
    int pos = 0;
    for (int i = 0; i < size; i++)
    {
        xor ^= a[i];
    }
    tmp = xor;
    while (xor)//找出不同的一位
    {
        if ((xor & 1) == 1)
            break;
        pos++;
        xor >>= 1;
    }
    for (int i = 0; i < size; i++)
    {
        if ((a[i] >> pos) & 1)
        {
            (*p1)^= a[i];

        }
        xor = tmp;
        *p2 = xor ^ (*p1);
        
    }
     printf("%d\t%d\n", *p1, *p2);
}

评论: