C/C++:与运算、或运算、异或运算、指针

前言忘记进制的同学先看这里:

十进制数,没有前缀
二进制数,前缀是0b
八进制数,前缀是0o
十六进制数,前缀是0x

let decimalInteger = 17
let binaryInteger = 0b10001       // 二进制的17
let octalInteger = 0o21           // 八进制的17
let hexadecimalInteger = 0x11     // 十六进制的17

一、与运算

两个都是1,结果就为1;&运算通常用于二进制取位操作;
一般用来:

  1. 判断奇偶
  2. 取余
1、判断奇偶

一个数 &1的结果就是取二进制的最末位。
这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数是偶数,最末位为1表示该数为奇数
5 & 1 = 0b101 & 0b001 = 0b 001 = 1,奇数,效率比 5%2 快多了

2、取余

比如:11 % 4 = 3;
因为4的二进制位 0b100,所以4需要减一,(4-1) = 3 = 0b011

0b1011 & 0b0011 =  0b11 = 3

二、或运算

或运算:只要1个为1,那么结果就为1

0b 00111
| 
0b 11100

0b 11111

用处:其实际意义就是把这个数强行变成最近接的偶数。

例如一个数|1的结果就是把二进制最末位强行变为1。如果需要把二进制最末位变成0,对这个数 |1之后再减一就可以了,

三、位移运算

1、<<运算

a<<b 表示把a转为二进制后左移b位(在后面添加 b个0)。

例如100的二进制表示为1100100,100左移2位后(后面加2个零):1100100<<2 =110010000 =400,可以看出,a<<b的值实际上就是a乘以2的b次方,因为在二进制数后面添加一个0就相当该数乘以2,2个零即2的2次方 等于4。通常认为a<<1比a*2更快,因为前者是更底层一些的操作。因此程序中乘以2的操作尽量用左移一位来代替。

定义一些常量可能会用到<<运算。你可以方便的用1<<16 -1 来表示65535(unsingned int 最大值16位系统)。很多算法和数据结构要求数据模块必须是2的幂,此时就可以用<<来定义MAX_N等常量。

2、>>运算

和<<相似,a>>b表示二进制右移b位(去掉末b位),相当于a除以2的b次方(取整)。

我们经常用>>1来代替 /2(div 2),比如二分查找、堆的插入操作等等。想办法用>>代替除法运算可以使程序的效率大大提高。最大公约数的二进制算法用除以2操作来代替慢的出奇的%(mod)运算,效率可以提高60%。

int a =100;
a/4 ==a>>2;

var a = 10;        //0b 1010
var b = a << 3;    //0b 1010 000
print("b is \(b)")
b = 11 >> 2;       //0b 1011
print("b is \(b)")

//打印

b is 80
b is 2

运用:大小端转换

unsigned char classPoint[4];
uint32_t a = classPoint[0];
uint32_t b = classPoint[1];
uint32_t c = classPoint[2];
uint32_t d = classPoint[3];
uint32_t off = (d << 24) + (c << 16) + (b << 8) + (a << 0);

四:指针

指针操作


    // *p + 1
    // *(p + 1)
    // char * p
    // char * q
    // p = q + 1
    int a[] = {2,11,33,14,55};
    int *p;
    int *q;
    p = a;
    q = p+1;
    printf("%d \n",*p + 1);   	---> 2 + 1 = 3
    printf("%d \n",*(p + 1)); 	---> a[0+1] = 11
    printf("%d \n",*q);			---> a[0+1] = 11

五:如何判断大小端

short a = 0x1122;
unsigned char b;
unsigned char c;
b = ((char*)&a)[0]; // 低地址为放低位
c = ((char*)&a)[1]; // 高地址放高位
printf("b:%d,c:%d",b,c);
// b:34,c:17

在这里插入图片描述

b:34,c:17 --> b:0x22,c:0x11 -->小端模式,低地址放低位,高地址放高位
反之就是大端模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值