當前位置:首頁 » 編程語言 » 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;
}