linux c按位运算符

原文地址http://daileinote.com/computer/c_base/09

按位取反:~
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);
}

原文地址http://daileinote.com/computer/c_base/09

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值