c语言取字节中的某一位,c语言中如何提取二进制数中的某一位?,C编程中如何提取二进制中的某一位或者连续几位...

问题标题

c语言中如何提取二进制数中的某一位?,C编程中如何提取二进制中的某一位或者连续几位

2019-4-4来自ip:12.124.150.84的网友咨询

浏览量:868 手机版

问题补充:

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),通过右移操作num>>i,二进制向右移动i位。

//i=0,num>>0,右移0位,此时1010&(0001)=0 //i=1,num>>1,右移1位,此时0101&(0001)=1,count++ //i=2,num>>2,右移2位,此时0010&(0001)=0 //i=3,num>>3,右移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|=(1> (y)&1) ...

网友答案

“C语言里怎样提取一个十六进制数的最高位?”具体解决方案如下:解决方案1:你是不是想这样/对于0x30,3是最高位,0是最低位?如果是的话那就这样办:首先不同类型处理方法不同,int型是2字节,伱可以这样最高为提取,int a=b&0xf09(b为提取对象),最地位int a=b&0x0f(b为提取对象),long型是4字节伱可以这样,long a=b&0xf000,long a=b&0x000f;还有什么再问那稍加修改:int a=b&1000000000000000b,int a=b&0000000000000001b,long a=b&10000000000000000000000000000000b,int a=b&00000000000000000000000000000001b;这是2进制数的位操作,虽然看起来麻烦,但是效率最高,其他还有方法,但是在单片机中不推荐如果你学过汇编这点很好理解,没学过也没事,我现在说给你听,这里提取取位用到的是c语言种的为操作,&与操作的定义是:1&1=1,1&0=0,0&1=0,0&0=0,|或操作的定义是:1|1=1,1|0=1,0|1=1,0|0=0,所以要提取二进制中的某一位,思想是保留那一位,其余为全为0,这样就&操作符就可以轻松做到,比如0011&0001=0001,提取最低位,0011&1000=1000,提取最高位,还有就是在c语言里int型是2字节,long型是4字节解决方案2:的意思应该a=0x30;b=a>>7;得到的b是0x30的最高位

网友答案

如果只有一位是1的话,很好做啊,这个变量a只可能是1或2或4或8或16或32或64或128,这样的话程序就好写了,可以用for语句,我下边写个最简单的:if (a==1)i=0;else if (a==2)i=1;else if (a==4)i=2;else if (a==8)i=3;........printf"第%d位是1 \n",i;

网友答案

0变1其它位不变,位或一个该位为1其它位为0的数可得1变0其它位不变,位与一个该位为0其它位为1的数可得得到等N位为1其它位为0的数,可用1左移N位即得得到等N位为0其它位为1的数,用前数位反一下即得演示程序:#includechar*int2bin(int ,char* );int main(){int x0,x1,n,flag;char x0b33={0};char x1b33={0};while(1){x0 = x1 = n = flag = -1;printf"输入原始数值 操作位0-31 和操作方式1置/0清\n");scanf("%d %d %d", &x0, &n, &flag);if( n31 || flag!=0&&flag!=1 ) break;//无效输入将退出if(flag==1)//置1{x1 = x0 | (1}else//清0{x1 = x0 & ~(1}printf"处理前十进制:%-10d 二进制:%s\n", x0,int2bin(x0,x0b));printf"处理后十进制:%-10d 二进制:%s\n\n",x1,int2bin(x1,x1b));fflush(stdin);}return 0;}char*int2bin(int x,char*out){for(int i=0;iouti = (x&(1out32 = '\0';return out;}

网友答案

伱是不是想这样/对于0x30,3是最高位,0是最低位?如果是的话那就这样办:首先不同类型处理方法不同,int型是2字节,伱可以这样最高为提取,int a=b&0xf09(b为提取对象),最地位int a=b&0x0f(b为提取对象),long型是4字节伱可以这样,long a=b&0xf000,long a=b&0x000f;还有什么再问那稍加修改:int a=b&1000000000000000b,int a=b&0000000000000001b,long a=b&10000000000000000000000000000000b,int a=b&00000000000000000000000000000001b;这是2进制数的位操作,虽然看起来麻烦,但是效率最高,其他还有方法,但是在单片机中不推荐

网友答案

这个函数可以计数x中1的个数:int count_bit1(unsigned int x){ int n=0;do { n += x &1; x>>=1; } while (x!=0);return (n);}请注意这里x必须定义为unsigned型,如果写成有符号型,则当x是负数时>>运算因符号扩展永远不完。

网友答案

“C语言里怎样提取一个十六进制数的最高位?”具体解决方案如下:解决方案1:你是不是想这样/对于0x30,3是最高位,0是最低位?如果是的话那就这样办:首先不同类型处理方法不同,int型是2字节,伱可以这样最高为提取,int a=b&0xf09(b为提取对象),最地位int a=b&0x0f(b为提取对象),long型是4字节伱可以这样,long a=b&0xf000,long a=b&0x000f;还有什么再问那稍加修改:int a=b&1000000000000000b,int a=b&0000000000000001b,long a=b&10000000000000000000000000000000b,int a=b&00000000000000000000000000000001b;这是2进制数的位操作,虽然看起来麻烦,但是效率最高,其他还有方法,但是在单片机中不推荐如果你学过汇编这点很好理解,没学过也没事,我现在说给你听,这里提取取位用到的是c语言种的为操作,&与操作的定义是:1&1=1,1&0=0,0&1=0,0&0=0,|或操作的定义是:1|1=1,1|0=1,0|1=1,0|0=0,所以要提取二进制中的某一位,思想是保留那一位,其余为全为0,这样就&操作符就可以轻松做到,比如0011&0001=0001,提取最低位,0011&1000=1000,提取最高位,还有就是在c语言里int型是2字节,long型是4字节解决方案2:的意思应该a=0x30;b=a>>7;得到的b是0x30的最高位...

我来回答

验证码:

e9568dae565949379ec40a9dfa476c45.gif

大家还关注

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值