位运算与可变数组——C语言程序设计(十二)

本文介绍了C语言中的位运算,包括按位与、按位或、按位取反、按位异或及移位操作,并通过示例解释了它们在编程中的应用场景。同时,讲解了可变数组ResizableArray的接口设计,提供了一种动态调整数组大小的方法。
摘要由CSDN通过智能技术生成

C语言程序设计(十二)

位运算

按位运算

  • C有这些按位运算的运算符:
  • & 按位的与
  • | 按位的或
  • ~ 按位取反
  • ^ 按位的异或
  • << 左移
  • >> 右移

按位与 &

  • 如果 ( x ) i = = 1 (x)_ i == 1 (x)i==1​ 并且 ( y ) i = = 1 (y)_i == 1 (y)i==1​​​​,那么 ( x & y ) i = 1 (x \& y)_ i =1 (x&y)i=1​​​
  • 否则的话 ( x & y ) i = 0 (x \& y)_i = 0 (x&y)i=0
  • 按位与常用于两种应用:
    • 让某一位或某些位为0:x & 0xFE
    • 取一个数中的一段:x & 0xFF

按位或 |

  • 如果 ( x ) i = = 1 (x)_i == 1 (x)i==1​ 或 ( y ) i = = 1 (y)_i == 1 (y)i==1​​,那么 ( x ∣ y ) i = 1 (x | y)_i = 1 (xy)i=1​​​
  • 否则的话, ( x ∣ y ) i = = 0 (x | y)_i == 0 (xy)i==0
  • 按位或常用于两种应用:?
  • 使得一位或几个位为1:x | 0x01
  • 把两个数拼起来:0x00FF | 0xFF00

按位取反 ~

  • (~x) i = 1 - (x) i
  • 把1位变0,0位变1
  • 想得到全部位为1的数:~0
  • 7的⼆二进制是0111,x | 7使得低3位为1,⽽而
  • x & ~7,就使得低3位为0

逻辑运算vs按位运算

  • 对于逻辑运算,它只看到两个值:0和1
  • 可以认为逻辑运算相当于把所有⾮非0值都变成1,然后做按位运算
  • 5 & 4 —>45 && 4 —> 1 & 1 —> 1
  • 5 | 4 —> 55 || 4 —> 1 | 1 —> 1
  • ~4 —> 3!4 —> !1 —> 0

按位异或 ^

  • 如果 ( x ) i = = ( y ) i (x)_i == (y)_i (x)i==(y)i​​​​​​ ,那么 ( ( (x ^ y ) i = 0 )_i = 0 )i=0​​​​​​

  • 否则的话, ( ( (x ^ y ) i )_i )i == 1

  • 如果两个位相等,那么结果为0;不相等,结果为1

  • 如果x和y相等,那么x ^ y的结果为0

  • 对一个变量用同一个值异或两次,等于什么也没做

    • x ^ y ^ y —> x

左移 <<

  • i << j
  • i中所有的位向左移动 j 个位置,而右边填入0
  • 所有小于int的类型,移位以int的方式来做,结果是int
  • x <<= 1 等价于 x *= 2 //乘于2
  • x <<= n 等价于 x *= $2^ n $​​.//乘于 2 n 2^n 2n

右移 >>

  • i >> j
  • i 中所有的位向右移 j 位
  • 所有小于int的类型,移位以int的方式来做,结果是int
  • 对于unsigned的类型,左边填入0
  • 对于signed的类型,左边填入原来的最高位(保持符号不变)
    • x >>= 1 等价于 x /= 2
    • x >>= n 等价于 x /= 2 n 2^n 2n .

no zuo no die

  • 移位的位数不要用负数,这是没有定义的行为
    • x << -2 //!!NO!! 错误的!

可变数组

Resizable Array(可变数组)

  • Think about a set of functions that provide a mechanism of resizable array of int.
    • Growable
    • Get the current size
    • Access to the elements

the Interface

  • Array array_create(int init_size);

  • void array_free(Array *a);

  • int array_size(const Array *a);

  • int* array_at(Array *a, int index);

  • void array_inflate(Array *a, int more_size);

array.h文件

#ifndef __ARRAY_H__
#define __ARRAY_H__

typedef struct{
	int *array;
	int size;	
}Array;  

Array array_create(int init_size);
void array_free(Array *a);
int array_size(const Array *a);
int* array_at(Array *a, int index);
void array_inflate(Array *a, int more_size);

#endif

END!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值