本文章以CHIPSEA的CPU 汇编指令集和C语言,对字节操作和位操作做一个简单的总结,一是可以为大家嵌入式的开发提供一点想法,二是加深自己的理解,便于能力提高。
Q1:如何进行按位取反操作?
// C Program (64bit Machine)
#include <stdio.h>
unsigned char ini_data;
int main()
{
ini_data=1;
printf("%x vs %x", ini_data,~ini_data); // result is 1 vs fffffffe
}
// 占位符整理
// short/int : %d
// long: %ld;
// long long: %lld
// char : %c
// float/double : %f float默认是6位小数输出;可以在%f中控制;例如:%.2f:输出两位小数;
// char *s(字符串) :%s
// unsigned: %u (signed:有符号类型, unsigned:无符号类型;默认都是有符号的)
// o:%o 以0开头
// hex:%x 以0x开头
// asm program
R_tmp1 equ 80h // define a register address
COMF R_tmp1, 0/1 // opposite the register and save it to work or register
Q2:如何实现按位与操作?
// C program (64bit machine)
#include <stdio.h>
unsigned char ini_data;
int main()
{
ini_data=0x88;
printf("%x vs %x", ini_data,ini_data&0xff); // result is 88 vs 88
}
// asm program
R_temp0 equ 80h
movlw 0x0F
andlw 0xA3 // literal & work, result is 0x03
andwf R_temp0, w/f // register & work, result saved work or register
Q3:如何实现按位或操作?
// C praogram
#include <stdio.h>
unsigned char ini_data;
int main()
{
ini_data=0x88;
printf("%x vs %x", ini_data,ini_data|0x11); // result is 88 vs 99
}
// asm program
R_temp0 equ 80h
movlw 0x88
iorlw 0x11 // literal & work, result is 0x99
iorwf R_temp0, w/f // register & work, result saved work or register
Q4:如何实现异或操作?
// c program (64bit machine)
#include <stdio.h>
unsigned char ini_data;
int main()
{
ini_data=0x0f;
printf("%x vs %x", ini_data,ini_data^0xf0); // result is 0f vs ff
}
// asm program
R_temp0 equ 80h
movlw 0x0f
xorlw 0xf0 // literal & work, result is 0xff
xorwf R_temp0, w/f // register & work, result saved work or register
Q5:与比特掩码:如何判断某一bit的状态?
与比特掩码,在嵌入式中常见于隐藏flag中相应的标志位。或者可以判断某一个bit是0还是1;或者可以将某一位置为0;
#include <stdio.h>
unsigned char ini_data;
int main()
{
ini_data=0xff;
bit_mask=0x02;
printf("%x vs %x", ini_data,ini_data&bit_mask); // result is 0x02
}
Q6:或比特掩码:如何在不影响其他位的情况下,将某个bit置1?
与比特掩码,在嵌入式中常见于Set字节中的某一位,而不影响其他bit位。
// c program (64bit machine)
#include <stdio.h>
unsigned char ini_data;
int main()
{
ini_data=0x00;
printf("%x vs %x", ini_data,ini_data|0x02); // set bit2 =1;
}
Q7:或非比特掩码:如何在不影响其他位的情况下,将指定的几个bit置0?
// c program (64 bit machine)
#include <stdio.h>
unsigned char ini_data;
unsigned char mask_data;
int main()
{
ini_data=0x0f;
mask_data=0xb6; // clear bit1 and bit2 of ini_data;
printf("%x vs %x", ini_data,ini_data&~mask_data); // result is 0x0f vs 0x09
}
Q8:异或比特掩码:如何在不影响其他位的情况下,切换固定几个bit置的状态?
// c pragram (64 bit machine)
#include <stdio.h>
unsigned char ini_data;
unsigned char mask_data;
int main()
{
ini_data=0x0f;
mask_data=0xb6;
printf("%x vs %x", ini_data,ini_data^mask_data); // shift ini_data bit states of bit=1 in mask_data
}
综上所述,在嵌入式中,经常会对字节中的比特进行标志位的判定,置1,置0,或者同时对几个bit进行置1和置0,运用以上方法可以快速的对byte中的bit进行操作。