C语言和汇编语言的字节*(byte)和位(bit)操作总结

       本文章以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进行操作。

 

 

 

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值