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
- 让某一位或某些位为0:
按位或 |
- 如果 ( 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
- 按位或常用于两种应用:?
- 使得一位或几个位为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 —>4
而5 && 4 —> 1 & 1 —> 1
5 | 4 —> 5
而5 || 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