c的移位操作符和位操作符

移位操作符:对二进制数进行移动
<<左移操作符:左边丢弃,右边补0
>>右移操作符:
逻辑右移:就是不考虑符号位,右移一位,左边补零即可
算术右移:需要考虑符号位,右移一位,若符号位为1,就在左边补1;否则,就补0
所以算术右移也可以进行有符号位的除法,右移n位就等于除2的n次方
 
左边第一位代表符号位,1代表负数,
 以补码形式存放在内存中
  负数:
整数的二进制表示形式:其实有三种

  1. 原码:直接根据数值写出二进制序列
  2. 反码:原码的符号位不变,其他位按位取反
  3. 补码:反码+1

正数,原码反码补码相同

复制代码
copy
#include <stdio.h>
int main()
{
    int a =-1;
    //原码:10000001
    //反码:11111110
    //补码:11111111
    int b =a>>1;
    //补码:11111111——>反码:111111110——>原码10000001
    printf("%d ",b);//b=-1    return 0;
}
复制代码

位操作符

复制代码
copy
int main()
{
    /*int a = -1;
    int b = a >> 1;
    printf("%d\n", b);*/
    int a = 3;//00000000 00000000 00000000 00000011
    int b = 5;//00000000 00000000 00000000 00000101
    int c = a & b;//00000000 00000000 00000000 000000001按(二进制)与
    int d = a | b;//00000000 00000000 00000000 000000111按(二进制)或
    int e = a ^ b;//00000000 00000000 00000000 000000110按(二进制)异或
    //^:规则相同为零,相异为1
    return 0;
}
复制代码

示例:不创建第三个变量,交换两个整形变量的值

复制代码
copy
int main()
{
    ////1.这种方法有弊端,当两个变量的值足够大,就会超出int的范围
    int a = 3;//00000000 00000000 00000000 00000011
    int b = 5;//00000000 00000000 00000000 00000101
    //a = a + b;
    //b = a - b;
    //a = a - b;

    //2使用^
    a = a ^ b;//00000000 00000000 00000000 000000110
    b = a ^ b;//00000000 00000000 00000000 000000011
    a = a ^ b;//00000000 00000000 00000000 000000101
    printf("%d%d\n", a, b);
    return 0;
}
复制代码

 

posted @   卡卡罗特kk  阅读(92)  评论(0编辑  收藏  举报
相关博文:
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
展开