标签:赋值操作符 序列 lines 简洁 截取 -- strong 决定 相等
移位操作符分为左移操作符(<<)和右移操纵符(>>)
对于无符号数:左右位移操作都是逻辑位移
对于有符号数:到底是采用逻辑位移还是算术位移取决于编译器.如果一个出现使用了有符号数的右移操作,它就是不可移植的.
对于左移操作:右边空出来的位数用0补齐.
对于右移操作:如果是逻辑位移,左边移入的位用0填充;如果是算术位移,左边移入的位由原先该值的符号位决定,符号为为1则移入的位均为1,符号为为0则移入的位均为0.
注意:
a << -5;
这种形式的移位由编译器决定.它产生的效果是不可预知的.
位操作符对它们的操作数的各个位执行与,或,异或,补等逻辑操作.
包括: AND OR XOR, 分别代表 与,或,异或,(补)
对应的操作符是: & | ^ ~
/*
* 统计输入的字符串中 行数,制表符,字符的个数,注意没有break,因为美出现一次换行符就表示单词个数和字符个数也增加了,每出现一次 空字符或制表符,字符个数也增加了
*/
int ch;
int lines = 0;
int words = 0;
int chars = 0;
while ((ch = getchar()) != EOF) {
switch (ch) {
case ‘\n‘:
lines += 1;
case ‘ ‘:
case ‘\t‘:
words += 1;
default:
chars += 1;
}
}
//把value1 的第五位数置为1
int value1 = 5;
printf("value1: %d ",value1);//5 b0101
value1 = value1 | 1 << 5;//把value1 的第五位数置为1
printf("value1: %d\n",value1);//37 b10101
//把value2 的第5位数置为0
int value2 = 32;
printf("value2: %d ", value2);//32 b10000
value2 = value2 & ~( 1 << 5);
printf("value2: %d\n", value2);//0 b00000
//测试第4位是否为1
int value3 = 15;
printf("value3: %d\n", value3);//15
printf("value3 的第4位为 %d \n",(value3 & 1 << 4));//value3 的第4位为 0
//返回函数参数值中值为1的位的个数
int count_one_bits(unsigned value) {
int ones;
for(ones = 0; value != 0; value >>= 1){
if ((value & 1) != 0) {
ones += 1;
}
}
return ones;
}
需要注意的点:
a = x = y +3;
如果x是一个字符型变量,那么 y+3的值就会被截去一段,以便容纳与字符类型的变量中.那么a所赋的值就是被截取后的值.
还有之前提到的:
char ch;
while((ch = getchar()) !=EOF)
因为EOF需要的位数比字符型值所能提供的位数要多,这也是getchar返回一个整型值而不是字符值的原因.然而,把 getchar() 的返回值先存储与ch中将导致它被截断.
然后这个被截断的值被提升位整型并与EFO进行比较.这段存在错误的代码在使用有符号字符集的机器上运行时,如果读取了一个值位\377的字节时,循环将会终止.因为这个值截短再提升之后与EOF相等.当这段代码在使用无符号字符集的机器上运行时,这个循环将永远不会终止.
此外还有复合赋值符, 它可以是程序变得简洁
+= -= *= /= %=
<<= >>= &= ^= |=
**
! ++ - & sizeof
~ -- + * (类型)
**
! 逻辑反操作
~ 求补操作
标签:赋值操作符 序列 lines 简洁 截取 -- strong 决定 相等
原文地址:https://www.cnblogs.com/wjw-blog/p/10384086.html