c語言mask函數(shù) python mask函數(shù)

C語言中的位屏蔽(bit masking)是怎么回事

位屏蔽的含義是從包含多個位集的一個或一組字節(jié)中選出指定的一(些)位。為了檢查一個字節(jié)中的某些位,可以讓這個字節(jié)和屏蔽字(bit mask)進(jìn)行按位與操作(C的按位與運(yùn)算符為&)——屏蔽字中與要檢查的位對應(yīng)的位全部為1,而其余的位(被屏蔽的位)全部為0。例如,為了檢查變量flags的最低位,你可以讓flags和最低位的屏蔽字進(jìn)行按位與操作:

創(chuàng)新互聯(lián)建站是專業(yè)的明水網(wǎng)站建設(shè)公司,明水接單;提供成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行明水網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!

flags1;

為了置位所需的位,可以讓數(shù)據(jù)和屏蔽字進(jìn)行按位或操作(C的按位或運(yùn)算符為|)。例如,你可以這樣置位flags的最低位:

flags = flags | 1;

或者這樣:

flags |= 1;

為了清除所需的位,可以讓數(shù)據(jù)和對屏蔽字按位取反所得的值進(jìn)行按位與操作。例如,你可以這樣清除flags的最低位:

flags = flags ~1;

或者這樣:

flags=~1 ;

有時,用宏來處理標(biāo)志會更方便,例10.2中的程序就是通過一些宏簡化了位操作。

例10.2 能使標(biāo)志處理更方便的宏

/* Bit Masking * /

/ * Bit masking can be used to switch a character

between lowercase and uppercase * /

#define BIT_POS(N) ( 1U ?0?0(N) )

#define SET_FLAG(N,F) ( (N) | = (F) )

#define CLR_FLAG(N,F) ( (N) = - (F) )

#define TST_FLAGCN,F) ( (N) (F) )

#define BIT_RANGE(N,M) ( BIT_POS((M) + 1- (N))-1(N))

#define BIT_SHIFTL(B,N) ( (unsigned)(B)?0?0(N) )

#define BIT_SHIFTR(B,N) ( (unsigned)(B)?0?3(N) )

#define SET_MFLAG(N,F,V) ( CLR_FLAG(N,F), SET_FLAG(N,V) )

#define CLR_MFLAG(N,F) ( (N) = ~(F) )

#define GET_MFLAG(N,F) ( (N) (F) )

# include stdio. h

void main()

{

unsigned char ascii_char = 'A'; /* char = 8 bits only */

int test_nbr = 10;

printf("Starting character = %c\n" , ascii_char);

/" The 5th bit position determines if the character is

uppercase or lowercase.

5th bit = 0 - Uppercase

5th bit = 1- Lowercase * /

printf ("\nTurn 5th bit on = %c\n" , SET_FLAG(ascii_char, BIT_POS(5)));

printf ("Turn 5th bit off = %c\n\n",CLR_FLAG(ascii_char, BIT_POS(5)));

printf ("Look at shifting bits\n");

printf (" = = = = = = = = = = = = = = = =\n" );

printf ("Current value = %d\n" , test_nbr)i

printf ("Shifting one position left = %d\n" ,

test_nbr = BIT_SHIFTL(test_nbr, 1) );

printf ("Shifting two positions right = %d\n" ,

BIT_SHIFTR(test_nbr, 2) );

}

宏BIT_POS(N)能返回一個和N指定的位對應(yīng)的屏蔽字(例如BIT_POS(O)和BIT_POS(1)分別返回最低位和倒數(shù)第二位的屏蔽字),因此你可以用

#define A_FLAG BIT_POS(12)

#define A_FLAG BIT_P0S(13)

代替

#define A_FLAG 4096

#define A_FLAG 8192

這樣可以降低出錯的可能性。

宏SET_FLAG(N,F(xiàn))能置位變量N中由值F指定的位,而宏CLR_FLAG(N,F(xiàn))則剛好相反,它能清除變量N中由值F指定的位。宏TST_FLAG(N,F(xiàn))可用來測試變量N中由值F指定的位,例如:

if (TST_FLAG (flags, A_FLAG))

/* do something * /;

宏BIT_RANGE(N,M)能產(chǎn)生一個與由N和M指定的位之間的位對應(yīng)的屏蔽字,因此,你可以用

# define FIRST_OCTAL_DIGIT BIT_RANGE (0,2) /*111"/

# define SECOND-OCTAL-DIGIT BIT-RANGE(3,5) /* 111000*/

代替

#define FIRST_OCTAL_DIGIT 7 /*111*/

#define SECOND_OCTAL_DIGIT 56 /* 111000 * /

這樣可以更清楚地表示所需的位。

宏BIT_SHIFT(B,N)能將值B移位到適當(dāng)?shù)膮^(qū)域(從由N指定的位開始)。例如,如果你用標(biāo)志C表示5種可能的顏色,你可以這樣來定義這些顏色:

#define C_FLAG BIT-RANGE(8,10) /* 11100000000 */

/* here are all the values the C flag can take on * /

# define C_BLACK BIT-SHIFTL(0,8) /* ooooooooooo */

# define C-RED BIT_SHIFTL(1,8) /* 00100000000 */

# define C-GREEN BIT_SHIFTL(2,8) /* 01000000000 */

# define C-BLUE BIT-SHIFTL(3,8) /* 01100000000 */

# define C_WHITE BIT-SHIFTL(4,8) /* 10000000000 */

# defineC-ZERO C-BLACK

# defineC-LARGEST C-WHITE

/* A truly paranoid programmer might do this */

#if C_LARGEST C_FLAG

Cause an error message. The flag C_FLAG is not

big enough to hold all its possible values.

#endif /* C_LARGEST C_FLAG */

宏SET_MFLAG(N,F(xiàn),V)先清除變量N中由值F指定的位,然后置位變量N中由值V指定的位。宏CLR_MFLAG(N,F(xiàn))的作用和CLR_FLAG(N,F(xiàn))是相同的,只不過換了名稱,從而使處理多位標(biāo)志的宏名字風(fēng)格保持一致。宏GET_MFLAG(N,F(xiàn))能提取變量N中標(biāo)志F的值,因此可用來測試該值,例如:

if (GET_MFLAG(flags, C_FLAG) == C_BLUE)

/*do something */;

注意:宏BIT_RANGE()和SET_MFLAG()對參數(shù)N都引用了兩次,因此語句

SET_MFLAG(*x++,C_FLAG,C_RED);

的行為是沒有定義的,并且很可能會導(dǎo)致災(zāi)難性的后果。

求c語言將十進(jìn)制數(shù)轉(zhuǎn)換為16進(jìn)制的函數(shù)

c語言將十進(jìn)制數(shù)轉(zhuǎn)換為16進(jìn)制的函數(shù):

#includestdio.h

main()

{

int u10;

char u16[10];

int w=0,a,b,i;

printf("請輸入一個數(shù)字--");

scanf("%d",u10);

if(u10==0)

{

u16[0]='0';

w++;

}

else

{

a=u10;

while(a)

{

b=a%16;

if(b10)

{

u16[w]='0'+b;

}

else

{

u16[w]='A'+b-10;

}

a=a/16;

w++;

}

}

printf("\n");

printf("%d(10)轉(zhuǎn)換為16進(jìn)制數(shù)字為:",u10);

for(i=w-1;i=0;i--)

{

printf("%c",u16[i]);

}

printf("\n");

}

擴(kuò)展資料:

十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)方法

十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)時,由于整數(shù)和小數(shù)的轉(zhuǎn)換方法不同,所以先將十進(jìn)制數(shù)的整數(shù)部分和小數(shù)部分分別轉(zhuǎn)換后,再加以合并。

1. 十進(jìn)制整數(shù)轉(zhuǎn)換為二進(jìn)制整數(shù) 十進(jìn)制整數(shù)轉(zhuǎn)換為二進(jìn)制整數(shù)采用"除2取余,逆序排列"法。具體做法是:用2去除十進(jìn)制整數(shù),可以得到一個商和余數(shù);再用2去除商,又會得到一個商和余數(shù),如此進(jìn)行,直到商為零時為止,然后把先得到的余數(shù)作為二進(jìn)制數(shù)的低位有效位,后得到的余數(shù)作為二進(jìn)制數(shù)的高位有效位,依次排列起來。

2.十進(jìn)制小數(shù)轉(zhuǎn)換為二進(jìn)制小數(shù)

十進(jìn)制小數(shù)轉(zhuǎn)換成二進(jìn)制小數(shù)采用"乘2取整,順序排列"法。具體做法是:用2乘十進(jìn)制小數(shù),可以得到積,將積的整數(shù)部分取出,再用2乘余下的小數(shù)部分,又得到一個積,再將積的整數(shù)部分取出,如此進(jìn)行,直到積中的小數(shù)部分為零,或者達(dá)到所要求的精度為止。

然后把取出的整數(shù)部分按順序排列起來,先取的整數(shù)作為二進(jìn)制小數(shù)的高位有效位,后取的整數(shù)作為低位有效位。

參考資料:

百度百科-十進(jìn)制

C語言中的標(biāo)準(zhǔn)函數(shù)有哪些?

C語言輸入輸出函數(shù)有很多,標(biāo)準(zhǔn)I/O函數(shù)中包含了如下幾個常用的函數(shù):

scanf,printf,getc,putc,getchar,putchar,gets,puts,fgets,fputs,fgetc,fputc,fscanf,fprintf等.

int

getc(FILE

*fp)

getc主要是從文件中讀出一個字符.常用的判斷文件是否讀取結(jié)束的語句為

(ch

=

getc(fp))

!=

EOF.EOF為文件結(jié)束標(biāo)志,定義在stdio.h中,就像EXIT_SUCCESS,EXIT_FAILURE定義在stdlib.h中一樣,文件也可以被理解為一種流,所以當(dāng)fp為stdin時,getc(stdin)就等同于getchar()了.

int

putc(int

ch,FILE

*fp)

putc主要是把字符ch寫到文件fp中去.如果fp為stdout,則putc就等同于putchar()了.

int

getchar(void)

getchar主要是從標(biāo)準(zhǔn)輸入流讀取一個字符.默認(rèn)的標(biāo)準(zhǔn)輸入流即stdio.h中定義的stdin.但是從輸入流中讀取字符時又涉及到緩沖的問題,所以并不是在屏幕中敲上一個字符程序就會運(yùn)行,一般是通過在屏幕上敲上回車鍵,然后將回車前的字符串放在緩沖區(qū)中,getchar就是在緩沖區(qū)中一個一個的讀字符.當(dāng)然也可以在while循環(huán)中指定終止字符,如下面的語句:while

((c

=

getchar())

!=

'#')這是以#來結(jié)束的.

int

putchar(int

ch)

putchar(ch)主要是把字符ch寫到標(biāo)準(zhǔn)流stdout中去.

char

*

gets(char

*str)

gets主要是從標(biāo)準(zhǔn)輸入流讀取字符串并回顯,讀到換行符時退出,并會將換行符省去.

int

puts(char

*str)

puts主要是把字符串str寫到標(biāo)準(zhǔn)流stdout中去,并會在輸出到最后時添加一個換行符.

char

*fgets(char

*str,

int

num,

FILE

*fp)

str是存放讀入的字符數(shù)組指針,num是最大允許的讀入字符數(shù),fp是文件指針.fgets的功能是讀一行字符,該行的字符數(shù)不大于num-1.因為fgets函數(shù)會在末尾加上一個空字符以構(gòu)成一個字符串.另外fgets在讀取到換行符后不會將其省略.

int

fputs(char

*str,

file

*fp)

fputs將str寫入fp.fputs與puts的不同之處是fputs在打印時并不添加換行符.

int

fgetc(FILE

*fp)

fgetc從fp的當(dāng)前位置讀取一個字符.

int

fputc(int

ch,

file

*fp)

fputc是將ch寫入fp當(dāng)前指定位置.

int

fscanf(FILE

*fp,

char

*format,

輸入列表)

fscanf按照指定格式從文件中出讀出數(shù)據(jù),并賦值到參數(shù)列表中.

int

fprintf(FILE

*fp,

char

*format,

輸出列表)

fprintf將格式化數(shù)據(jù)寫入流式文件中.

數(shù)據(jù)塊讀寫函數(shù)

fread

(buffer,size,count,fp);

fwrite(buffer,size,count,fp);

參數(shù)說明:

buffer:是一個指針。

對fread

來說,它是讀入數(shù)據(jù)的存放地址。

對fwrite來說,是要輸出數(shù)據(jù)的地址(均指起始地址)。

size:

要讀寫的字節(jié)數(shù)。

count:

要進(jìn)行讀寫多少個size字節(jié)的數(shù)據(jù)項。

fp:

文件型指針。

linux編程中mask是什么意思呀?

Enable:允許中斷,默認(rèn)為unmask if NULL

Disable:禁止中斷,默認(rèn)為mask if NULL

Mask:mask 一個中斷源,通常是關(guān)閉中斷

mask_ack:響應(yīng)并mask中斷源

unmask:unmask中斷源

例如

irq_desc[irq].mask = PCF50606_mask_irq;

irq_desc[irq].unmask = PCF50606_unmask_irq;

//mask,unmask函數(shù)與enable_irq/disable_irq對應(yīng),把使能禁止中斷對應(yīng)到設(shè)置pcf50606中斷mask中

C語言位運(yùn)算求解

//取第n1到n2的位的值,第n1位的權(quán)比第n2的權(quán)高,

int getbits(short int value, int n1, int n2)

{

short int mask = 1;

int t;

if(n2n1) // 如果n2比n1小,則交換

{

t=n2;

n2=n1;

n1=t;

}

int len = n2-n1; // 要取值多少位

for(int i=0;i=len;i++)

{

mask = 1;//移動一位

mask |= 1; //把最后一位補(bǔ)0的值,改成值1

}

mask = 16 - n2;// 生成可以用來屏蔽不需要的位的數(shù)據(jù)

value =mask; // 只保留需要的位

return value;

}

有什么不明白,找偶,再加點(diǎn)分吧,哈哈

分享文章:c語言mask函數(shù) python mask函數(shù)
當(dāng)前地址:http://muchs.cn/article28/hgihjp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈、面包屑導(dǎo)航、ChatGPT移動網(wǎng)站建設(shè)、企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名