linux c按位运算符

2018-05-16 17:19:50

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

©著作权归作者所有
收藏
推荐阅读
简介
天降大任于斯人也,必先苦其心志。