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