linux c按位运算符

https://blog.csdn.net/freecls/article/details/80340649

原文地址http://www.freecls.com/a/2712/25

按位取反:~
0变成1,1变成0。

按位与:&
两边都为1的为1,其他为0。

按位或:|
只要有一方为1的就为1,其他为0。

按位异或:^
一方为0,一方为1的为1,其他为0

例子

#include<stdio.h>

typedef unsigned char u_char;

void main()
{
    u_char c;
    u_char a = 3;     //00000011
    u_char b = 100;   //01100100
    
    c = ~a;              //11111100即252
    printf("%d\n", c);   //252
    
    c = a & b;           //00000000
    printf("%d\n", c);   //0
    
    
    c = a | b;           //01100111即103
    printf("%d\n", c);   //103
    
    c = a ^ b;           //01100111即103
    printf("%d\n", c);   //103
}


下面由例子看一次实际应用场景

#include<stdio.h>

typedef unsigned char u_char;

void main()
{
    u_char res;
    u_char f = 202;     //11001010
    
    u_char mask = 2;        //00000010
    res = f & mask;           //只让第1位显示
    
    //打开设置位
    res = f | mask;           //开启1位(第1位必定为1)
    
    //关闭位
    res = f & ~mask;          //也就是与11111101与,第1位必定关闭
    
    //切换位
    //假设我们想把最后3位切换,则mask可以设置为11100000(只需把想切换的为设为1)
    //运算一次切换一次
    mask = 224;             //11100000
    res = f ^ mask;           //00101010
    
    //判断位是否为1
    //比如想判断第1位是否为1,则可以吧mask设置为00000010
    mask = 2;     //00000010
    if((f & mask) == mask){
        printf("已开启\n");
    }
}


左移运算符:<<
左侧的值向左移动,移出左端的值丢失,用0填充右边空出来的位置。

右移运算符:>>
右侧的值向右移动,移出右端的值丢失,无符号的类型用0来填充左边空出来的位置,有符号的根据操作系统来决定用1或0来填充。

#include<stdio.h>

typedef unsigned char u_char;

void main()
{
    u_char res;
    
    //无符号
    u_char f = 185;     //10111001
    
    res = f << 2;
    printf("%d\n", res);//228    11100100
    
    res = f >> 2;
    printf("%d\n", res);//46    00101110
    
    //有符号
    char g = 185;       //10111001
    res = g >> 2;
    printf("%d\n", res);//238    11101110
}
实际应用:

1.number << n    number乘以2的n次幂
2.number >> n    如果number为非负,则为number除以2的n次幂
3.也可以用来提取部分的位

#include<stdio.h>

typedef unsigned char u_char;
typedef unsigned int u_int;

void main()
{
    u_int s = 0xa;      //10
    
    //相当于s*2^4
    s = s << 4;
    printf("%d\n", s);      //160
    
    //相当于s/(2^2)
    s = s >> 2;
    printf("%d\n", s);      //40
    
    //提取部分位
    u_char mask = 0xff;     //11111111
    
    u_int rgb = 0x00bbccdd;
    
    u_char blue = rgb & mask;
    u_char green = (rgb >> 8) & mask;
    u_char red = (rgb >> 16) & mask;
    
    //dd    cc    bb
    printf("%x %x %x\n", blue, green, red);
}


总结
1.本文对linux c按位运算符做了简单的介绍,如果有疑问可以给我留言
2.gcc4.8,运行环境centos7 64位
3.原文地址http://www.freecls.com/a/2712/25
--------------------- 
作者:戴磊freecls 
来源:CSDN 
原文:https://blog.csdn.net/freecls/article/details/80340649 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值