• 位运算


    神奇的位运算

     1 #include<cstdio>
     2  
     3 int turnten(int n)//二进制转十进制
     4 {
     5     return n==1?1:turnten(n/10)%10*2+n%10;
     6 }
     7 int turntwo(int n)//十进制转二进制 
     8 {
     9     return n==1?1:turntwo(n/2)*10+(n&1);
    10 }
    11 int main()
    12 {
    13     int n=10010;
    14     int m=turnten(n); 
    15     printf("%d
    ",m);//18,注意以下操作要使用m去位运算,且都是从第0位算起的 
    16     
    17     //(n>>k)&1操作 
    18     for(int i=0;i<5;i++)//取出二进制的第i位
    19         printf("%d ",(m>>i)&1);//0 1 0 0 1
    20     
    21     //n&((1<<k)-1)操作 
    22     printf("
    %d
    ",turntwo(m&((1<<3)-1))); //取出后三位,即010
    23     
    24     //n^(1<<k)操作 
    25     printf("%d
    ",turntwo(m^(1<<2)));//将第2位取反,即变成10110
    26     
    27     //n|(1<<k)操作 
    28     printf("%d
    ",turntwo(m|(1<<3)));//将第3位赋值为1,即11010
    29     
    30     //n&(~(1<<k))操作
    31     printf("%d
    ",turntwo(m&(~(1<<1))));//将第1位赋值为0,即10000
    32     
    33     //n&(~n+1)操作
    34     printf("%d
    ",turntwo(m&(~m+1)));
    35     //lowbit运算,取出非负整数m在二进制表示下最低位的1以及它后面的0构成的数的值,此处会输出:10
    36     
    37     //求解第几位有数字1
    38     int h[1<<4];
    39     for(int i=0;i<=4;i++)
    40         h[1<<i]=i;//初始化标注若有1则它该出现在哪儿
    41     while(m>0)
    42     {
    43         printf("%d ",h[m&-m]);
    44         m -= m&-m;
    45         //m&-m操作,等同于m&(~m+1),此处会输出1 4 
    46     } 
    47      
    48     return 0;
    49 }
  • 相关阅读:
    android_自定义布局
    二叉树_学习笔记
    栈的应用-四则表达式(C#代码实现)
    Android Fragment 生命周期
    Android Fragment之间传值
    Android ArrayAdpater 填充集合
    任务和返回栈
    XML Drawable与9-Patches
    《python语言程序设计》_第一章编程题
    CSS-文本超出部分省略号
  • 原文地址:https://www.cnblogs.com/1013star/p/9479888.html
Copyright © 2020-2023  润新知