• C/C++ 位操作


    C/C++对位操作有如下方法:

    <1>位操作运算符(注意:下面几个运算符不改变原来的变量的值,只是获得运算的结果即一个新值)

    按位取反:~

    位与:&

    位或:|

    位异或:^

    左移位运算符:<<

    将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。
    若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。

    右移位运算符:>>

    将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。
    操作数每右移一位,相当于该数除以2。

    无符号右移运算符:>>>

    >>> 运算符把 expression1 的各个位向右移 expression2 指定的位数。右移后左边空出的位用零来填充。移出右边的位被丢弃。

    <2>位字段

    如下C++代码:

    struct bits
    {
        unsigned int a:1;
        unsigned int b:1;
        unsigned int c:10;
        unsigned int d:21;
    };

      位字段由一个结构声明,该结构声明为每个字段提供标签,并决定标签字段的宽度.

      上面的使用unsigned int作为位字段结构的基本布局单元,因此即使一个结构只有一个一位的成员字段,该结构也和一个unsigned int的大小相同,上面用sizeof看为8,机器sizeof(unsigned int)为4,若把最后一个改为d:20,则本机器的sizeof刚好为4.

      另外,十六进制前面加 0x,八进制前加 0

    -------------------------------------------------------------------------------------------------------------------------------------------------------

    一:写一个函数,返回将给定数字的后给定位数反转,即0变1,1变0

      思路:~是将整个数的全部位取反了,不合适.用异或^,把给定值和一个后面几位全部是1前面剩下的都是0的数^,即可.

      关键是怎么获得那个后面几位全是1的数?

    #include <iostream>
    
    using namespace std;
    
    int invert_end(int num,int bits)    //第一个表示传进来的数值,第二个是让这个数值的后多少位反转
    {
        int mask=0;   //此时全部位为0
        int temp=1;    //此时它的最后一位是1
    
        while (bits>0)
        {
            mask=mask|temp;   //或,每次只把1位置为1
            temp=temp<<1;    //它的唯一一个是1的位向左移
            bits--;
        }
    
        return num^mask;   //mask的后几位已经为1,异或即可
    }
    
    int main(void)
    {
        cout<<sizeof(int)<<endl;
        int val;
        cout<<"输入一正整数:
    ";
        cin>>val;
    
        int res=invert_end(val,3);
        cout<<val<<"  "<<res;
    
        cin.get();
        return 0;
    }
  • 相关阅读:
    Linux下查看文件和文件夹大小的df和du命令(链接)
    路由的原理和作用[赛迪网]
    select 好用插件
    如何启动/停止/重启MySQL
    Spirng quartz 整合
    String,StringBuffer与StringBuilder的区别
    如何给input[file]定义cursor
    dns简介
    浏览器高级对象
    shell 学习文章列表
  • 原文地址:https://www.cnblogs.com/jiayith/p/3500367.html
Copyright © 2020-2023  润新知