文档章节

C和指针---第五章:操作符和表达式

fzyz_sb
 fzyz_sb
发布于 2013/09/14 16:41
字数 722
阅读 57
收藏 0

5.1 操作符

+ - * / %

除了%操作符,其余几个操作符都是既适用于浮点型又适用于整型。%要求必须是整型。

5.1.2 移位操作符

移位操作符必须是整型。右移位操作存在两种移位方式:逻辑右移和算术右移。

逻辑右移:用0来填充左边空出来的位

算术右移:用符号位来填充左边空出来的位。

下列代码返回参数值中1的位个数:

int count_one_bits( unsigned value ){
	int ones;

	for ( ones = 0; value != 0; value = value >> 1 ){
		if ( value % 2 != 0 ){
			ones += 1;
		}
	}

	return ones;
}
5.1.3 位操作符

要求操作数为整型类型。

例子1:将指定的位设置为1

value = value | 1 << bit_number;
例子2:将指定的位清0
value = value & ~(1 << bit_number);
例子3:对指定的位进行测试
value & 1 << bit_number;
5.1.4 赋值和复合赋值符

计算一个值中值为1的位的个数:

int count_one_bits( unsigned value ){
	int ones = 0;
	for ( ones = 0; value != 0; value >>= 1 ){
		if ( ( value & 1 ) != 0 ){
			ones += 1;
		}
	}

	return ones;
}

5.3 左值和右值

左值就是那些能够出现在赋值符号左边的东西。右值就是那些可以出现在赋值符号右边的东西。左值有个要求是:必须表示一个特定的位置。所以字符串常量不能是左值,因为它在内存中的存储位置是随机的。

习题:

1. 

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int ch;
	while ( ( ch = getchar() ) != EOF ){
		if ( ( ch >= 'A' ) && ( ch <= 'Z' ) ){
			putchar( ch - 'A' + 'a' );
			continue;
		}
		putchar( ch );
	}

	return 0;
}

程序输入输出:

2.

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int ch;

	while ( ( ch = getchar() ) != EOF ){
		if ( ( ch >= 'a') && ( ch <= 'z' ) ){
			putchar( (ch - 'a' >= 13 ) ? ch - 13 : ch + 13 );
			continue;
		}
		else if ( ( ch >= 'A' ) && ( ch <= 'Z' ) ){
			putchar( (ch - 'A' >= 13 ) ? ch - 13 : ch + 13 );
			continue;
		}
		putchar( ch );
	}

	return 0;
}

程序输入输出:

3. 

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

unsigned int reverse_bits( unsigned int value ){
	unsigned int tempValue = 0;
	int i = 0;
	while ( i < sizeof( unsigned int ) * 8 - 1){
		tempValue += ( value & ( 1 << i ) ? 1 : 0 ) << ( sizeof( unsigned int ) * 8 - i - 1 );
		i++;
	}

	return tempValue;
}

int main(void)
{
	printf("%x\n", reverse_bits(25));

	return 0;
}

我用十六进制看了后,答案是正确的,但是如果用%d来显示,却依旧是个负数,虽然已经是unsigned int了,不知道为什么。

4. 

#include <stdio.h>
#include <stdlib.h>

#define MAXLINE 128

void set_bit( char bit_array[], unsigned bit_number ){
	bit_array[bit_number] = 1;
}

void clear_bit( char bit_array[], unsigned bit_number ){
	bit_array[bit_number] = 0;
}

void assign_bit( char bit_array[], unsigned bit_number, int value ){
	if ( !value ){
		bit_array[bit_number] = 0;
	}
	else{
		bit_array[bit_number] = 1;
	}
}

int test_bit( char bit_array[], unsigned bit_number ){
	return bit_array[bit_number];
}

int main(void)
{
	char bit_array[MAXLINE];
	int i = 0;
	for ( i = 0; i < MAXLINE; i++ ){
		bit_array[i] = 0;
	}
	set_bit( bit_array, 5 );
	printf("%d\n", bit_array[5] );

	clear_bit( bit_array, 5 );
	printf("%d\n", bit_array[5] );

	assign_bit( bit_array, 5, 4 );
	printf("%d\n", bit_array[5] );

	printf("%d\n", test_bit( bit_array, 5 ) );

	return 0;
}

程序输入输出:

5.

#include <stdio.h>
#include <stdlib.h>

int store_bit_field( int original_value, int value_to_store, unsigned starting_bit, unsigned ending_bit ){
	int maskValue = 0;
	int maskValueForStore = 0;
	int new_value_to_store = 0;
	int i = 0;
	for ( i = ending_bit; i <= starting_bit; i++ ){
		maskValue += 1 << i;
		maskValueForStore += 1 << (i - ending_bit);
	}
	original_value &= ~maskValue;
	value_to_store &= maskValueForStore;
	value_to_store <<= ending_bit;
	return original_value | value_to_store;
}

int main(void)
{
	int value = store_bit_field( 0xffff, 0x123, 13, 9 );
	printf("%x\n", value);

	return 0;
}

程序输出:


© 著作权归作者所有

共有 人打赏支持
fzyz_sb
粉丝 408
博文 209
码字总数 447144
作品 0
武汉
程序员
《程序员面试宝典》精华 编程语言部分

《程序员面试宝典》精华 编程语言部分 正所谓取其精华,去其糟粕。本文谨记录下《程序员面试宝典》一些关键的知识点、易错点,对于一些虽然重要但书中没有解释清楚的地方不做记录。当然这里的...

modernizr
2014/08/11
410
2
c++ primer 第五版学习笔记

第二章 函数体外定义的内置类型变量会初始化为0,函数体外的是未初始化的 用constexpr声明变量表示它是一个常量表达式(编译器可以确定的值),且只能应用于字面值 c++11中可以用 来定义一个...

David栗子
2017/12/11
0
0
阅读《C陷阱与缺陷》的知识增量

看完《C陷阱与缺陷》,忍不住要重新翻一下,记录一下与自己的惯性思维不符合的地方。记录的是知识的增量,是这几天的流量,而不是存量。 这本书是在ASCI C/C89订制之前写的,有些地方有疏漏。...

modernizr
2014/08/11
368
2
阅读《C陷阱与缺陷》的知识增量

看完《C陷阱与缺陷》,忍不住要重新翻一下,记录一下与自己的惯性思维不符合的地方。记录的是知识的增量,是这几天的流量,而不是存量。 这本书是在ASCI C/C89订制之前写的,有些地方有疏漏。...

modernizr
2014/06/30
613
7
C++ primer第二次阅读学习笔记(第5章)

第五章 对于两个数的除法和求模,若均为正,则结果均为正。若均为负,除法结果为正,取模的结果为负。若一正一负,则结果依赖于具体编译器。 之所以不能串联使用关系操作符如if(i=1,结果恒为...

长平狐
2012/10/08
52
0

没有更多内容

加载失败,请刷新页面

加载更多

身处小公司,如何在2年内快速突破,拿到大厂offer?|掘金技术征文

本文是我一个朋友的经历,谨以此文告诉那些向往更好的未来发展而一直努力奋斗的朋友们。不管你现在身处什么小公司,都不要气馁,机会还是有的,只要你敢于拼搏奋斗,我相信你一定可以成功的。...

SuShine
24分钟前
1
0
web应用防火墙的作用

web应用防火墙也被称为网站应用级入侵防御系统,按照一些常规的定义,WAF是指通过一些列针对HTTP/HTTPS的安全策略专门为web应用提供保护的产品。它主要用于防御针对网络应用层的攻击,像SQL...

上树的熊
25分钟前
2
0
5分钟掌握var,let和const异同

转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://dzone.com/articles/javascript-difference-between-var-let-and-const-...

葡萄城技术团队
28分钟前
3
0
gif工具ffmpeg 的安装

ffmpeg 是一个可以将视频生成gif 格式的图片的工具, 下面说说如何安装这个工具吧: 1、 2 3 4 5 配置环境变量:

wangyanbao
29分钟前
1
0
RocketMq在windows下安装

mqnamesrv.cmd -n localhost:9876#启动namesrvmqbroker.cmd #启动brokermqbroker.cmd -n localhost:9876 autoCreateTopicEnable=true//启动控制台java -jar rocketmq-console-ng......

王桥修道院副院长
29分钟前
1
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部