c语言置某一位为1函数 c语言取某一位的值

c语言中如何提取二进制数中的某一位?下面是三种方式:
①通过模2除2(%2、/2)的方法
num%2——取出二进制的最后一位
num/2——右移去掉二进制的最后一位
通过while循环 , 依次取出二进制的最后一位数字判断是否为1,若为1则count++,while(num)只有当num变为0时循环结束 。
问题:在测试-1出现bug,-1的二进制中应该有32个1,输出却为0 。我们将-1带入代码中发现-1%2=0,count不增,然后-1/2=0,循环结束 , 故输出count的值为0 。
解决方案:将变量num的数据类型改为unsigned int (无符号整型),此时表示的是正的整型的最大值,所以当num=-1时,表示二进制为32个1的正数,通过循环可以输出正确的个数 。
②通过右移操作符()、按位与操作符()实现
Example:当num=10(1010) , 通过右移操作numi , 二进制向右移动i位 。
//i=0,num0 , 右移0位,此时(1010)(0001)=0
//i=1,num1,右移1位,此时(0101)(0001)=1,count++
//i=2,num2,右移2位,此时(0010)(0001)=0
//i=3,num3,右移3位 , 此时(0001)(0001)=1 , count++
……
因为二进制共32位,所以循环要执行32次后结束,得到count为2 。
缺点:不够高效,必须循环32次 。
③通过按位与操作符()巧妙运算实现
Example:当num=15时,
1//num(num-1)=(1111)(1110)=(1110)
2//num(num-1)=(1110)(1101)=(1100)
3//num(num-1)=(1100)(1011)=(1000)
4//num(num-1)=(1000)(0111)=0,循环停止 。共执行4次while循环 。
扩展资料
一、指定的某一位数置1
宏 #define setbit(x,y)x|=(1y)
二、指定的某一位数置0
宏#define clrbit(x,y)x=~(1y)
三、指定的某一位数取反
宏#define reversebit(x,y)x^=(1y)
四、获取的某一位的值
宏 #define getbit(x,y)((x)(y)1)
C语言标志位位常用的置0 和置1都好似什么意思好似信号标志 。例如 红灯c语言置某一位为1函数 , 绿灯 。
标志位 置1用按位 或c语言置某一位为1函数,置0用按 与 。
例如:
unsigned short int flag;
假定 最高位 是 信号标志
置1flag = flag | 0x8000;
置0flag = flag0x7FFF;
0,1, 谁是红灯c语言置某一位为1函数,谁是绿灯,由编程者决定 。
c语言中,如何设置只输出数字的第一位,比如说,计算得到125这个数,但只需要显示第一位的数字,也就是1#include "stdio.h"
char Get_FirstNumber(int number)
{
int i;
for (i = 1; number / i != 0; i *= 10);
return (number / (i / 10))%10;
}
int main()
{
printf("%d", Get_FirstNumber(92345));
return 0;
}
C语言中“二进制指定的某一位数0变1,或者1变0,并输出该数值”的代码是什么?0变1其它位不变,位或一个该位为1其它位为0的数可得
1变0其它位不变,位与一个该位为0其它位为1的数可得
得到等N位为1其它位为0的数,可用1左移N位即得
得到等N位为0其它位为1的数,用前数位反一下即得
演示程序:
#includestdio.h
char*int2bin(int ,char* );
int main()
{
int x0,x1,n,flag;
char x0b[33]={0};
char x1b[33]={0};
while(1)
{
x0 = x1 = n = flag = -1;
printf("输入原始数值 操作位(0-31) 和操作方式(1置/0清)\n");
scanf("%d %d %d", x0, n, flag);
if( n0 || n31 || flag!=0flag!=1 ) break;//无效输入将退出
if(flag==1)//置1
{
x1 = x0 | (1n); //n位置1
}
else//清0
{
x1 = x0~(1n); //n位清0
}
printf("处理前十进制:%-10d 二进制:%s\n",x0,int2bin(x0,x0b));

推荐阅读