bilibiliclass17-操作符详解

本文详细介绍了C++中的位操作符,包括除法、取模、右移、左移、按位与、按位或、按位异或等,并通过实例展示了如何交换两个整数的值以及计算整数二进制位中1的数量。同时,讨论了赋值操作符、单目操作符、逻辑操作符和条件操作符的用法。
摘要由CSDN通过智能技术生成

 

操作符详解

/除法操作符:得到的是商,一边是小数,则结果是小数
%取模操作符:只能对整数操作
>>右移操作符:移动的是二进制位
            1.算术右移:右边丢弃,前面补符号位(正数最前为0,负数前面为1)
            2.逻辑右移:右边丢弃,前面0
            见到的基本是算术右移
            右移1位有除2的效果
            例子:
            int a = -1;
            //整数的二进制表示有:原码、反码、补码
            //存储到内存的是补码
            //正整数的原码、反码、补码相同,直接写原码就ok了
            //10000000000000000000000000000001    -   -1的原码
            //11111111111111111111111111111110    -   -1的反码(除符号位按位取反)            
            //11111111111111111111111111111111    -   -1的补码(反码加1)
            int b=a >> 1;//b=-1
            //1(补上符号位)  1111111111111111111111111111111  1(丢掉)
            //还是补码-1
            //printf();打印出来的是原码
<<左移操作符:移动二进制位,左边丢弃,右边补零        
            //不能移动负数位,只能作用于整数
位操作符:            
    &操作符:按2进制位与
                int a = 3;
                int b = 5;
                int c = a&b;//1
                //a:011
                //b:101
                //c:001
    |操作符:按2进制位或
                int a = 3;
                int b = 5;
                int c = a|b;//7
                //a:011
                //b:101
                //c:111            
    ^操作符:按2进制位异或(相同为0,相异为1)
                int a = 3;
                int b = 5;
                int c = a^b;//6
                //a:011
                //b:101
                //c:110                  

例题1:不创建临时变量,交换两个整数的值
int a = 3;
int b = 5;

//加减法
a = a+b;//a等于ab之和8
b = a-b;//b=3;
a = a-b;//a=5;
缺陷:如果a和b存储较大的整形时,二进制位可能会溢出

//异或法
a = a^b;//a=6 b=5
b = a^b;//a=6 b=3
a = a^b;//a=5 b=3
//a^b产生一个密码,密码和a异或可出b,密码和b异或可出a
//可读性较差

例题:求一个整数的二进制位中有几个1
int main()
{
    int num = 0;
    int count = 0;
    scanf("%d",&num);
    for(i=0;i<32;i++)
    {
    if (1==(num>>i)&1))
    count++;
    }
    printf("%d",num);
}
 //32bit
 //num&1==1;则一定为1
//统计num补码有几个1

//整数正确,负数则错误
/*int main()
{
    int num = 0;
    int count = 0;
    scanf("%d",&num);
    while(num)
    {
        if (num % 2 ==1)
        count++;
        num = num / 2;
    }
    printf("%d",num);
}*/

=赋值操作符
        连续赋值:a=x=y+1;//语法支持,但不推荐
        复合赋值符:+= -= *= /= %= >>= <<= &= |= ^=
        
单目操作符:只有一个操作数(a+b的+是双目操作符)
            应用场景if(a)//如果a为真则执行  
                      if(!a)//如果a为假则执行
            -负值 +正值
            &取地址操作符:int* p=&a;    *p;
            *解引用操作符
            sizeof()计算变量所占空间的大小
                初始化int arr[10]={0}
                int 4
                char 1
                char* 4或8
                arr 40
                [10] 数组类型 40
                [5] 20


                例题:判断两个printf的值
                int main()
                short s = 0;
                int a =10;
                printf("%d\n",sizeof(s=a+5));//2 --- short为2个字节
                printf("%d\n",s);//0 --- sizeof之中不改变变量


            ~ 按2进制位取反
                int a=0;
                printf("%d",~a);//-1
                例题:对a的二进制位的某位进行改变
                int a = 11;
                a = a | (1<<2);//15
                a = a & (~(1<<2));//11
            ++:前置++:先++,后使用
                后置++:先使用,后++
            --:前置--:先--,后使用
                后置--:先使用,后--
            (类型):强制类型转换
            
关系操作符:比较大小

逻辑操作符:&&逻辑与
                int a = 3;
                int b = 5;
                int c = a&&b;//1
                &&左边为假则右边的代码不执行
            ||逻辑或
                int a = 3;
                int b = 5;
                int c = a||b;//1
                ||左边为真则右边的代码不执行
条件操作符:(exp1?exp2:exp3)

56mins

 

 

 

 

 

            
            
            
            
            
            
            
            

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值