当前位置:首页 » 编程语言 » c语言getbit
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言getbit

发布时间: 2022-02-25 23:33:27

① 求GETBIT函数详解,计算规则。

② 求助c语言编写一个字节位互换

支持任意两位互换.

运行结果:
00000110 /* 输入数字, 23位是1 45位是0 */
00001010 /* 34互换后 */
00011000 /* 25也互换后 */

代码:

#include <stdio.h>
unsigned char mask(int n)
{
return 1 << (n-1);
}
void setbit(unsigned char *in, unsigned char n, unsigned char value)
{
if(value) (*in) |= mask(n);
else (*in) &= (~mask(n));
}
unsigned char getbit(unsigned char in, unsigned char n)
{
unsigned char value = in & mask(n);
if(value) return 1;
else return 0;
}
void swap(unsigned char *in, int m, int n)
{
unsigned char valuem = getbit(*in, m);
unsigned char valuen = getbit(*in, n);
setbit(in, n, valuem);
setbit(in, m, valuen);
}

void showbin(unsigned char x)
{
int i;
for(i=8;i>=1;i--){
printf("%d", getbit(x, i));
}
printf("\n");
}
int main()
{
/* 3位是1,, 2位是1, 4位是0, 5位是0. */
unsigned char a = mask(3) | mask(2);

showbin(a);

/* 34互换 */
swap(&a, 3, 4);
showbin(a);

/* 25互换 */
swap(&a, 2, 5);
showbin(a);

return 0;
}

③ #define GetBit(data, offset) (((data) >> (offset)) & 0x01)在C语言中是什么意思

定义一个带两个参数的宏,宏名为GetBit,作用是提取参数data中第offset比特的值。例子:GetBit(0x0001000,4)返回1,即第4比特的值。

④ 编写一个函数从一个32位的存储单元中取出某一位。函数的原型为:int getbit(int value, int n)

#include<stdio.h>


int getbit(int value, int n)

{

return (value >>(n-1)) &0x01;

}


int main(void)

{

int num = 0;

int n = 0;

printf("输入一个整数和提取位:");

scanf("%d %d",&num,&n);

printf("第%d位为:%d ", n, getbit(num,n));

return 0;

}

⑤ 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循环。

(5)c语言getbit扩展阅读

一、指定的某一位数置1

宏 #define setbit(x,y) x|=(1<<y)

二、指定的某一位数置0

宏 #define clrbit(x,y) x&=~(1<<y)

三、指定的某一位数取反

宏 #define reversebit(x,y) x^=(1<<y)

四、获取的某一位的值

宏 #define getbit(x,y) ((x) >> (y)&1)



⑥ c语言:取整型变量x中的第p位开始的n个bit位。求解析过程

c语言:取整型变量x中的第p位开始的n个bit位,可以采用位运算的方法。先向左移位,丢弃前面不需要的位,再通过向后移位,丢弃后面不需要的位,最后再向左移位到原来的位置,就可以了。

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循环。


(6)c语言getbit扩展阅读

一、指定的某一位数置1

宏 #define setbit(x,y) x|=(1<<y)

二、指定的某一位数置0

宏 #define clrbit(x,y) x&=~(1<<y)

三、指定的某一位数取反

宏 #define reversebit(x,y) x^=(1<<y)

四、获取的某一位的值

宏 #define getbit(x,y) ((x) >> (y)&1)

⑦ C语言编程:编写函数getbit(n,k),求出n从右边开始的第k位,在主函数中输入数据并调用结果。

128的二进制表示:10000000

从右往左数第八位是1

答案也简单:

C语言版:

intgetbit(intn,intk){
return(n>>(k-1))&1;
}

⑧ C语言位运算符,返回x中从第p位开始的n位

他说最右的一位是第0位,所以getbit(00101110,
4,
3)应该返回
011
而不是111。如果最右位是第1位,那你是对的。

⑨ c语言改错

我改编了一下你的程序,现在能执行出正确结果,不知是否符合条件
#include<stdio.h>
int getbit( int n)
{
int k = 0;
while(n!=0)
{
k++;
n/=10;
}
return k;
}

void main()
{ long n,max=0,min=0,k;
scanf("%ld",&n);
k=getbit(n);
int i,j,temp,num[20];
for(i=1;i<=k;i++)
{
num[i]=n%10;
n/=10;
}
for(i=1;i<=k;i++)
{
for(j=i+1;j<=k;j++)
if(num[i]<num[j])
{
temp=num[i];
num[i]=num[j];
num[j]=temp;
}
}
for(i=1;i<=k;i++)
{
max=max*10+num[i];
min=min*10+num[k+1-i];
}
printf("\nmax= %-10dmin=%-10d\n",max,min);

}

⑩ c语言编写函数getbit(n,k);求出n从右边开始的第k位。在主函数中输入数据并调用该函数输出

#include <stdio.h>
#include <stdlib.h>

int main()
{
int n,k,i=0;
int a[100];
for(i;i<100;i++)
a[i]=-1;
scanf("%d%d",&n,&k);
i=0;
while(n>0){ //将二进制表达形式存在数组中
a[i]=n%2;
n=n/2;
i++;
}
if(a[k-1]!=-1)
printf("%d",a[k-1]);
return 0;
}