C和指针 第五章 操作符和操作表达式
1,操作符的应用
- ?操作符使用
if (a >5)
b[2 *c + d( e /5 )] =3;
else
b[2 *c + d( e /5 )] =20;
//相当于下面表达式
b[2 *c + d( e /5 )] = a >5 ? 3 : 20;
2, 记录位操作符问题
-
位数组定义
位数组问题:存放于一个char 的字符数组中 对应的位的0 和 1即代表着数字
我们知道一个char 类型字符为1 byte = 8 bit相当于对应着8个位置
例如a[0] ->0 ~7 ; a[1] ->8 ~15; a[2] ->16 ~23 ……当你需要表示数字7 则使a[0] = 0000 0001 (相应的第七位置 1 即可)
这样 我们可以用字节的位 来表示数 可以更好的利用内存进行存储 -
代码实现部分
void set_bit( char bit_array[], unsigned bit_number ) {
bit_array[bit_number >>SHIFT] |= ( 1 << ((bit_number & MASK)) );
}
void set_bit_v1( char bit_array[], unsigned bit_number ) {
bit_array[bit_number >>SHIFT] |= ( 1 << (7 -(bit_number & MASK)) );
}
void clear_bit( char bit_array[], unsigned bit_number ) {
bit_array[bit_number >>SHIFT] &= ~( 1 <<(bit_number & MASK) );
}
void assign_bit( char bit_array[], unsigned bit_number, int value ) {
if(value) set_bit(bit_array, bit_number);
else clear_bit(bit_array, bit_number);
}
int test_bit( char bit_array[], unsigned bit_number ) {
return bit_array[bit_number >>SHIFT] & ( 1 << (bit_number & MASK) );
}
char* init_bitarray(int size) {
char* temp;
temp =malloc(size /8 +1); //+1 意味着处理 NUL 字符
memset(temp, 0, (size /8 +1)); //initialize to 0
return temp;
}
-
对应的代码部分的解释
例如 原来25-> 0000 0010 现在 25-> 0100 0000
所以7 -(bit_number & MAS) 就是直接将顺序正过来了
(bit_number & MAS) 代表1 所左移几位
所以8 -(bit_number & MAS) 就是直接将顺序正过来了
(bit_number & MAS) 代表1 所左移几位 -
逻辑上的一次错误
错误在循环的时候出现过,导致对于
7,13,,23这一类不能准确的输出打印对应的是例如 a 字符数组进行储存位数组
7-> a[0] 0000 000113-> a[1] 0000 000123-> a[2] 0000 0001。循环要有8次 才能准确输出
下面代码展示记录错误 //0x80 =128 =1000 0000 此处应该循环8 次 记录填坑 j 从0 到8结束 才能准确的遍历
for (int i = 0; i < 4096 / 8 + 1; i++)
{
for (int j = 0; (j < 8 && k < 10); j++)
{
if ((bit_arr[i] & 0x80) == 0x80)
{
num[k] = i * 8 + j +1;
k++;
}
bit_arr[i] <<= 1;
}
}
3,位操作符应用
题目描述:
把一个整数插入到一个整数所规定的位置里面 起始位是一定大于结束位的
可以更清楚的表明下面的返回值:
| 原始值 | 需要存储的值 | 起始位 | 结束位 | 返回值 |
|---|---|---|---|---|
| 0x0 | 0x1 | 4 | 4 | 0x10 |
| 0xffff | 0x123 | 15 | 4 | 0x123f |
| 0xffff | 0x123 | 13 | 9 | 0xc7ff |
- 过程思路 以最后一个为例
- 创建一个掩码 mask 把需要存储的那几个为设置为1,此时的掩码为0011 1110 0000 0000
- 用掩码的 反码对原值进行 & 操作 讲那几个设置的位置为0. 原值为 1111 1111 1111 1111 操作后变为1100 0001 1111 1111
- 将新值左移,使它与那几个需要存储的位进行对齐。新值 0X0123 0000 0001 0010 0011 ,左移后变为 0100 0110 0000 0000.
- 把移位后的值与原码进行 & 操作 ,只保留需要设定的那几个位的值。造作之后,结果为0000 0110 0000 0000.
- 把结果与原值 进行 | 操作 。结果变为 1100 0111 1111 1111 0Xc7ff
Finish!!!
代码如下:
int store_bit_field(int orginal_value, int value_to_store, unsigned starting_bit, unsigned ending_bit) {
unsigned mask =0x0000, temp;
int i, j;
for(i =0; i <=(starting_bit -ending_bit); i++) {
mask |= (1 << (ending_bit +i));
}
orginal_value =( orginal_value & (~ mask) ); //原值 与mask 反码 & 操作
value_to_store <<=ending_bit;
value_to_store &= mask;
value_to_store |= orginal_value;
print_bin(value_to_store);
printf("\n0x%x\n", value_to_store );
}
对于第一部 mask 的取值 思路:
利用一个 0000 0000 0000 0000 与对应的位(用 0000 0000 0000 0001 进行移位)进行 | (或) 操作 可取的 mask 值
表格学习工具
| 左对齐 | 右对齐 | 居中对齐 |
|---|---|---|
| 单元格 | 单元格 | 单元格 |
| 单元格 | 单元格 | 单元格 |
本文探讨了C语言中的位操作与指针应用,包括条件运算符的使用、位数组定义与操作、以及如何通过位操作实现整数位字段的插入。提供了详细的代码示例与解析。

5096

被折叠的 条评论
为什么被折叠?



