1 给出一个字节中被置为1的位的个数
相关知识点:
- & (按位与) :相同位都是1,则为1.如果有一个不为1,则为0 (有0出0)
- | (按位或) :相同位只要有一个为1,则为1 (有1出1)
- ~(按位取反):每一位0变1,1变0
- ^(按位异或):相同位不同,则为1;相同,则为0 (同死(0)异生(1))
- 右 移:右移一位,相当于除2,并且取整
- 左 移:左移一位,相当于乘2
在这里插入代码片int main(void)
{
int num = 0,i,count=0;
printf("int = ");
scanf("%d",&num);
for(i=0;i<8;i++)
{
if((num>>i)&1)
count++;
}
printf("count = %d\n",count);
return 0;
}
2 输入一个整数a,再输入两个整数p1,p2(p1,p2<32),输出该整数的二进制表示方法中从右端开始的p1到p2位
相关知识点:
int占32位,最大可以赋值为:2147483647。也就是0x7fffffff。
在计算机里我们的规定最高位是符号位。为0是正,为1是负。所以最高位是不可以参加计算的
int main()
{
int a,p1,p2,i;
printf("a=");
scanf("%d%d%d",&a,&p1,&p2);
for(i=p1;i<=p2;i++)
{
/*实际上,是从第1位开始遍历;但是计算机中,从第0位开始*/
printf("%d",((a>>i-1)&1));
}
}
3 输入一个整数a,再输入两个整数p(p<32),v(0|1),将该整数a的p位设置为v,输出修改后的该整数的二进制表示
相关知识点:
data|=(1<<n); 第n位置1
data&=~(1<<n); 第n位置0
data^=(1<<n); 第n位取反
(data>>n)&1; 取第n位的值
int main()
{
int a,p,v,i;
printf("input ");
scanf("%d%d%d",&a,&p,&v);
if(v==0)
a &=~(1<<p-1);
else
a |= (1<<p-1);
for(i=31;i>=0;i--)
{
printf("%d",((a>>i)&1));
}
}
4 将二进制数转成整数
int changeDate(char *str)
{
int sum =0;
int j = 1;
/*用作循环上限*/
int pos = strlen(str) - 1;
for(;pos>=0;pos--)
{
/*刚开始,pos最大,对应的是数组的最右边*/
sum += (str[pos]-'0')*j;
j *= 2;
}
return sum;
}
int main()
{
/*字符用单引号,字符串用双引号*/
int result = 0;
result = changeDate("111010101011101");
printf("the number is = %d",result);
return 0;
}