本文目录一览:
关于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/n/151088.html