① 求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;
}