C语言学习笔记14-按位运算

C语言-位运算

位运算主要用于操纵硬件时使用,接近底层。
逻辑运算相当于把非零数当成1,然后做相应的位运算。

位运算符:
按位与 & : 全1为1,其它皆0。作用:让某些位为零 x & 0xFE ;取一个数的一段 x & 0xFF
按位或 | : 有1就1,全0才0。作用:让某些位为1 x | 0x01 ;把两个数拼起来 0x00FF | 0xFF00
按位取反 ~ : 1变0,0变1。(注意与补码不同)x & ~y (单片机SFR让某一位为0,对多位操作使用struct 及 : 【位段】)
按位异或 ^ : 不同为1,相同取0。(可以做简单弱加密运算)

移位运算,位数不要用负数!
左移 << n位 等价于放大2n 倍(int)【不管符号位】 1u << k
右移 >> 缩小,(int),对于unsigned:左边填入0;对于signed型:左边最高位保留

例子:

#include <stdio.h>

void prtBin(unsigned int number);

struct U0 {
	//位段可以直接用位段的成员名访问,比 与、或、移位方便
	//编译器排列位的次序,所以程序不具有可移植性
	unsigned int leading: 3; //占3bit
	unsigned int FLAG1: 1;
	unsigned int FLAG2: 1;
	int trailing: 27; //如果超过一个int,会采用多个int
};

int main() {
	struct U0 uu;
	uu.leading = 2;
	uu.FLAG1 = 0;
	uu.FLAG2 = 1;
	uu.trailing = 0;
	printf("sizeof(uu)=%lu\n", sizeof(uu));
	prtBin(*(int*)&uu);
	
	return 0;
}

void prtBin(unsigned int number) {
	//输出二进制数,C语言没有直接输出二进制的格式
	unsigned mask = 1u << 31;
	for ( ; mask; mask >>= 1 ) {
		printf("%d", (number & mask ? 1 : 0));
	}
	putchar(10);
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值