文档章节

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

fzyz_sb
 fzyz_sb
发布于 2013/09/14 16:41
字数 722
阅读 57
收藏 0
点赞 0
评论 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
粉丝 404
博文 209
码字总数 447144
作品 0
武汉
程序员
《程序员面试宝典》精华 编程语言部分

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

modernizr ⋅ 2014/08/11 ⋅ 2

c++ primer 第五版学习笔记

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

David栗子 ⋅ 2017/12/11 ⋅ 0

阅读《C陷阱与缺陷》的知识增量

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

modernizr ⋅ 2014/08/11 ⋅ 2

阅读《C陷阱与缺陷》的知识增量

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

modernizr ⋅ 2014/06/30 ⋅ 7

C++ primer第二次阅读学习笔记(第5章)

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

长平狐 ⋅ 2012/10/08 ⋅ 0

Modern Fortran Explained学习笔记4

第三章.表达式和赋值语句 今天继续从第三章开始学习,第三章主要讲了表达式和赋值语句,其中最主要的是数组的表达和指针等概念的使用。 需要特别注意的点其实不多,主要的东西都是自动实现的...

粗衣大布裹天涯 ⋅ 2017/10/30 ⋅ 0

# 极客班C++OOP(下)第五周笔记

极客班C++OOP(下)第五周笔记 --- 0.关于vptr和vtbl 虚指针和虚表,通俗的说,两者主要用途就是,在继承关系中确定虚函数具体调用哪个函数时用的。 1 继承关系内存布局 子类一定含有父类的部...

NILYANG ⋅ 2016/04/15 ⋅ 0

C++ primer第二次阅读学习笔记(第18章:特殊工具与技术:运行时类型识别、extern。。。)

第十八章:特殊工具与技术:运行时类型识别 通过运行时类型识别(RTTI),程序能够使用基类的指针或引用来检查这些指针或引用所指向对象的实际类型。 通过两个操作符提供RTTI: 1:typeid操作...

长平狐 ⋅ 2012/10/08 ⋅ 0

不一样的C语法(一)无限加减

奇特语法 int a = -+-+-+-+1;int b = +!+!+!+!2;int c = +~-+~-+~3;int d = !1-2+!~-3; 2. 原理浅析 我不是很清楚上述代码的特性是否是在C99这一标准中最先定义的,还是在以前的标准中早有定...

痞子蔡 ⋅ 2014/06/18 ⋅ 0

指针和引用的区别

1、指针和引用的区别 (1)、引用必须代表某个对象,因此引用必须有初值,而指针没有此限制 (2)、指针可以被重新赋值,指向另一个对象,但是引用却总是指向它最初获得的那个对象 (3)、实...

hnxymjj ⋅ 2014/02/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Day 17 vim简介与一般模式介绍

vim简介 vi和Vim的最大区别就是编辑一个文件时vi不会显示颜色,而Vim会显示颜色。显示颜色更便于用户编辑,凄然功能没有太大的区别 使用 yum install -y vim-enhanced 安装 vim的三种常用模式...

杉下 ⋅ 28分钟前 ⋅ 0

【每天一个JQuery特效】根据可见状态确定是否显示或隐藏元素(3)

效果图示: 主要代码: <!DOCTYPE html><html><head><meta charset="UTF-8"><title>根据可见状态确定 是否显示或隐藏元素</title><script src="js/jquery-3.3.1.min.js" ty......

Rhymo-Wu ⋅ 37分钟前 ⋅ 0

OSChina 周四乱弹 —— 初中我身体就已经垮了,不知道为什么

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @加油东溪少年 :下完这场雨 后弦 《下完这场雨》- 后弦 手机党少年们想听歌,请使劲儿戳(这里) @马丁的代码 :买了日本 日本果然赢了 翻了...

小小编辑 ⋅ 56分钟前 ⋅ 8

浅谈springboot Web模式下的线程安全问题

我们在@RestController下,一般都是@AutoWired一些Service,由于这些Service都是单例,所以并不存在线程安全问题。 由于Controller本身是单例模式 (非线程安全的), 这意味着每个request过来,...

算法之名 ⋅ 今天 ⋅ 0

知乎Java数据结构

作者:匿名用户 链接:https://www.zhihu.com/question/35947829/answer/66113038 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 感觉知乎上嘲讽题主简...

颖伙虫 ⋅ 今天 ⋅ 0

Confluence 6 恢复一个站点有关使用站点导出为备份的说明

推荐使用生产备份策略。我们推荐你针对你的生产环境中使用的 Confluence 参考 Production Backup Strategy 页面中的内容进行备份和恢复(这个需要你备份你的数据库和 home 目录)。XML 导出备...

honeymose ⋅ 今天 ⋅ 0

JavaScript零基础入门——(九)JavaScript的函数

JavaScript零基础入门——(九)JavaScript的函数 欢迎回到我们的JavaScript零基础入门,上一节课我们了解了有关JS中数组的相关知识点,不知道大家有没有自己去敲一敲,消化一下?这一节课,...

JandenMa ⋅ 今天 ⋅ 0

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 今天 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 今天 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部