欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于二进制

程序员文章站 2022-07-15 09:59:00
...
引例1

求解一个二进制数有多少个1?

首先要提四个操作:

& : 按位与。 同1为1数A&1 = A ,数A & 0 = 0。
| : 按位或。 同0为0。
^ : 按位异或(不同为1)
~:按位取反
<< : 按位左移
>> :按位右移
以13(10) —> 1101(2) 为例

输出二进制数
//方法1
#include <iostream>
using namespace std;
void binary_output(int x){
    for(int i=1;i<=sizeof(x);i++){
        cout<<(x>>(sizeof(x)-i)&1)<<" ";
    }
    cout<<endl;
}
//方法2
void binary_output2(int x){
    stack<int>s;
    while(x>0){
        s.push(x&1);
        x = x >> 1;
    }
    while(!s.empty()){
        cout<<s.top()<<" ";
        s.pop();
    }
}
int main(){
    int num;
    cin>>num;
    binary_output(num);
    return 0;
}

回到问题,求解有多少个1,相当于二进制数的每一位与1取与。如果结果是1,则代表这一位是1,结果是0则代表这一位是0。

#include <iostream>
using namespace std;
//方法1
void binary_calOnes1(int x){
    int count = 0;
    for(int i=1;i<=sizeof(x);i++){
        if((x>>(sizeof(x)-i)&1) == 1)
            count++;
    }
    cout<<count<<endl;
}
//方法2
void binary_calOnes2(int x){
    int count = 0;
    while(x > 0){
        if((x&1) == 1)
            count++;
        x = x >> 1;
    }
    cout<<count<<endl;
}
int main(){
    int num;
    cin>>num;
    binary_calOnes2(num);
    return 0;
}
引例2 2016蓝桥杯A组第5题 消除尾一 代码填空

下面的代码把一个整数的二进制表示的最右边的连续的1全部变成0
如果最后一位是0,则原数字保持不变。
如果采用代码中的测试数据,应该输出:
00000000000000000000000001100111 00000000000000000000000001100000
00000000000000000000000000001100 00000000000000000000000000001100

#include <stdio.h>

void f(int x)
{
    int i;
    for(i=0; i<32; i++) printf("%d", (x>>(31-i))&1);
    printf("   ");

    x = _______________________;

    for(i=0; i<32; i++) printf("%d", (x>>(31-i))&1);
    printf("\n");    
}

int main()
{
    f(103);
    f(12);
    return 0;
}

例如A = 1100111
要消除A末尾的3个1
将A+1
A+1 = 1101000
取A&(A+1)即可
A&(A+1) = 1100000

答案:x = x&(x+1);

相关标签: 二进制