本文目錄一覽:
關於C語言定義掩碼
1、比如定義一個數
int a=0x1111
(unsigned int male=0x4)那麼 a|male 的值就是0001 0001 00010101 只有第三位影響了
unsigned int male=0xFF 那麼 a|male 的值就是111111111 0001 0001 後8位值不變
2、常式:
#include stdio.h
#include conio.h
#include ctype.h
#define MAX_PASSWD_LEN 20
char *GetPasswd(char pasw[]) {
unsigned char ch;
int i = 0;
while((ch = _getch()) != ‘\r’) {
if(i 0 ch == ‘\b’) {
–i;
putchar(‘\b’);
putchar(‘ ‘);
putchar(‘\b’);
}
else if(i MAX_PASSWD_LEN isprint(ch)) {
pasw[i++] = ch;
putchar(‘*’);
}
}
putchar(‘\n’);
pasw[i] = ‘\0’;
return pasw;
}
int main() {
char psw[MAX_PASSWD_LEN] = {0};
printf(“%s\n”,GetPasswd(psw));
return 0;
}
C語言位運算掩碼
一、位運算符c語言提供了六種位運算符:
按位與
|按位或
^按位異或
~取反
左移
右移
1.按位與運算按位與運算符””是雙目運算符。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1,否則為0。參與運算的數以補碼方式出現。
例如:95可寫算式如下:00001001(9的二進位補碼)00000101(5的二進位補碼)00000001(1的二進位補碼)可見95=1。
按位與運算通常用來對某些位清0或保留某些位。例如把a的高八位清0,保留低八位,可作a255運算(255的二進位數為0000000011111111)。
main(){
inta=9,b=5,c;
c=ab;
printf(“a=%d\nb=%d\nc=%d\n”,a,b,c);
}
2.按位或運算按位或運算符「|」是雙目運算符。其功能是參與運算的兩數各對應的二進位相或。只要對應的二個二進位有一個為1時,結果位就為1。參與運算的兩個數均以補碼出現。
例如:9|5可寫算式如下:00001001|00000101
00001101(十進位為13)可見9|5=13
main(){
inta=9,b=5,c;
c=a|b;
printf(“a=%d\nb=%d\nc=%d\n”,a,b,c);
}
3.按位異或運算按位異或運算符「^」是雙目運算符。其功能是參與運算的兩數各對應的二進位相異或,當兩對應的二進位相異時,結果為1。參與運算數仍以補碼出現,例如9^5可寫成算式如下:00001001^0000010100001100(十進位為12)
main(){
inta=9;
a=a^15;
printf(“a=%d\n”,a);
}
4.求反運算求反運算符~為單目運算符,具有右結合性。其功能是對參與運算的數的各二進位按位求反。例如~9的運算為:~(0000000000001001)結果為:1111111111110110
5.左移運算左移運算符「」是雙目運算符。其功能把「」左邊的運算數的各二進位全部左移若干位,由「」右邊的數指定移動的位數,
高位丟棄,低位補0。例如:a4指把a的各二進位向左移動4位。如a=00000011(十進位3),左移4位後為00110000(十進位48)。6.右移運算右移運算符「」是雙目運算符。其功能是把「」左邊的運算數的各二進位全部右移若干位,「」右邊的數指定移動的位數。
例如:設a=15,a2表示把000001111右移為00000011(十進位3)。應該說明的是,對於有符號數,在右移時,符號位將隨同移動。當為正數時,最高位補0,而為負數時,符號位為1,最高位是補0或是補1取決於編譯系統的規定。turboc和很多系統規定為補1。
main(){
unsigneda,b;
printf(“inputanumber:”);
scanf(“%d”,a);
b=a5;
b=b15;
printf(“a=%d\tb=%d\n”,a,b);
}
請再看一例!
main(){
chara=’a’,b=’b’;
intp,c,d;
p=a;
p=(p8)|b;
d=p0xff;
c=(p0xff00)8;
printf(“a=%d\nb=%d\nc=%d\nd=%d\n”,a,b,c,d);
}
c語言中的掩碼
注意0x是表示16進位數的意思,第四位是10進位的8,第五位是10進位的16,轉成16進位就是0x10,是沒錯的
C語言 數組問題
void out_set(unsigned char bit_id, bit value) {
if (bit_id = O_CNT) { //O_CNT=40
return;
}
if (value) {
out[bn[bit_id]] |= msk[bit_id]; //置位,將out數組的第bn[bit_id]位元組按照msk[bit_id]掩碼置位,假設bit_id=22,則bn[bit_id]=2,msk[bit_id]=0x40,就是把第2位元組的第6位設置為1,其他位不管out[2]變成:x1xxxxxx(x是原來的不變)
假設out[2]=0000 0000
out[bn[bit_id]] = out[bn[bit_id]] | msk[bit_id];就是
0000 0000 | 0100 0000 = 0100 0000
} else {
out[bn[bit_id]] = ~msk[bit_id]; //置0,將out數組的第bn[bit_id]位元組按照msk[bit_id]掩碼置0,假設bit_id=22,則bn[bit_id]=2,msk[bit_id]=0x40,就是把第2位元組的第6位設置為0,其他位不管out[2]變成:x0xxxxxx(x是原來的不變)
假設out[2]=1111 1111
out[bn[bit_id]] = out[bn[bit_id]] | ~msk[bit_id];就是
1111 1111 | 1011 1111 = 1011 1111
}
}
調用的時候就是這樣:
out_set(22, 1); //置位
out_set(22, 0); //置0
無頭無尾的,怎麼給你解釋?
這個不是數組的問題,應該是關於位運算的問題
—————————————————————————————–
bn表示第幾個位元組
msk就是掩碼
8個位元組,每個bit表示一個狀態:
1-有狀態(比如顯示紅色燈)
0-無狀態(比如關閉紅色燈)
#define OPENRED (data[bn[0]]|msk[0])
#define CLOSERED (data[bn[0]]|(~msk[0]))
unsigned char data[8]={1,2,3,4,5,6,7,8};
status = data[bn[i]] mask[i]; // 取狀態: 0/1
data[bn[i]] |= ~mask[i]; // 清除狀態:置0
data[bn[i]] |= mask[i]; // 設置狀態:置1
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/151088.html