关于二进制
程序员文章站
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);
上一篇: 二进制加减法
下一篇: C++二进制完成加减乘除