计算机系统基础实验第二周--数据的位运算操作

计算机系统基础实验第二周--数据的位运算操作


C语言的位运算操作包括两类,逻辑运算操作和逻辑移位操作。

逻辑运算操作

例1:
1.在home目录下的test文件夹中新建bit.c文本文件
bit.c代码如下

#include <stdio.h> 
void main( ) 
{ 
   int a=5;
   unsigned int b=3;
   short c=5;
   int d=0;

   a=~a;
   b=~b;
   c=~c;
   d=a&b;
   d=a^b;
   d=a|b;
   return;
}

在这里插入图片描述
2. 利用gcc命令可以分别编译为bit.o的可重定位目标文件和bit可执行目标文件。为了方便阅读使用符号’>’将反汇编后的内容保存在文件中。
在这里插入图片描述
3.使用gdb打开可执行文件。
在这里插入图片描述
在第四行设置断点。程序在第四行执行之前停下来。
在这里插入图片描述
单步执行程序,查看a的地址并进一步用二进制查看a的值
在这里插入图片描述
继续单步执行,当执行完a=~a后,用二进制查看a的值
在这里插入图片描述

单步执行程序,查看b的地址并进一步用二进制查看a和b的值
在这里插入图片描述

单步执行,当执行完d=a&b后,查看d的地址并用二进制查看d的值
在这里插入图片描述

例2:(布尔操作的运算在变量的单位上进行的)
1.在home目录下的test文件夹中新建bool.c文本文件
bool.c代码如下

#include <stdio.h> 
void main( ) 
{ 
   int a=5;
   unsigned int b=3;
   short c=5;
   int d=0;

   a = !a;
   b = !b;
   c = !c;
   d =a && b;
   d=a || b;
   return;
}

2.利用gcc命令可以分别编译为bool.o的可重定位目标文件和bool可执行目标文件。为了方便阅读使用符号’>’将反汇编后的内容保存在文件中
在这里插入图片描述
在这里插入图片描述

逻辑移位操作

1.在home目录下的test文件夹中新建shift.c文本文件
shift.c代码如下

#include <stdio.h>

void main()
{
	int a = 0x80000000;
	unsigned int b = 0x80000000;
	
	short c = 0x8000;
	unsigned short d = 0x8000;
	
	a=a>>4;
	b=b>>4;
	
	a=c;
	a=d;
	b=c;
	b=d;
	
	return;
}

2.利用gcc命令将其进行编译,objdump命令进行反汇编之后,main函数所对应的汇编指令如下所示
在这里插入图片描述
在这里插入图片描述
对比分析知,执行符号扩展还是零扩展由等号右边的变量类型决定的,与等号左边的变量类型无关。
在这里插入图片描述
3.使用jdb查看移位操作的结果
在这里插入图片描述
4.单步执行程序,查看a的地址并进一步用二进制查看a的值,查看a右移四位后结果,
因为是算术右移指令,补入4位符号位
在这里插入图片描述

5.单步执行程序,查看b的地址并进一步用二进制查看b的值,查看b右移四位后结果,
因为是逻辑右移指令,补入4位0
在这里插入图片描述
总结:
位运算的作用:
(1)可实现特定的功能:取特定位、保留特定位
(2)周期短速度快:左移、右移可用于实现快速的整数乘、除法
(3)可实现其他功能:原位交换等

交换变量a和变量b的值:
普通方法:c = a; a = b; b = c;
位操作交换法:a = a^b; b = b^a; a = a^b;
位操作法原理:b = b(ab) = bab = bba = a
a = (ab)(b(ab)) = abbab = b

Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.collectAndServe.

org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 0.0 failed 1 times, most recent failure: Lost task 0.0 in stage 0.0 (TID 0, localhost, executor driver): org.apache.spark.api.python.PythonException: Traceback (most recent call last):
File “/usr/local/spark/python/lib/pyspark.zip/pyspark/worker.py”, line 377, in main
process()
File “/usr/local/spark/python/lib/pyspark.zip/pyspark/worker.py”, line 372, in process
serializer.dump_stream(func(split_index, iterator), outfile)
File “/usr/local/spark/python/lib/pyspark.zip/pyspark/serializers.py”, line 400, in dump_stream
vs = list(itertools.islice(iterator, batch))
File “/usr/local/spark/python/lib/pyspark.zip/pyspark/util.py”, line 99, in wrapper
return f(*args, **kwargs)
File “”, line 12, in
File “”, line 9, in func1
IndexError: list index out of range

at org.apache.spark.api.python.BasePythonRunner$ReaderIterator.handlePythonException(PythonRunner.scala:456)

import findspark
findspark.init("/usr/local/spark") # 指明SPARK_HOME目录
from pyspark import SparkContext

sc.stop()
sc=SparkContext(appName=‘TopNtest’)
def func1(x): #自定义函数来读取数据
s = x.split()
return (s[0],s[1],s[2],s[3])

#导入数据且保持在内存中,其中cache():数据保持在内存中
a=sc.textFile(“file:/home/hadoop/桌面/TopNtest.txt”).map(lambda x:func1(x)).cache()

#按照武力值指标进行排序,并利用False选项指定由高到低排序
b=sc.parallelize(a.collect()).sortBy(lambda x: x[2],False).collect()
print(b)

#利用take()算子取RDD的前5个元素
#sc.parallelize(b).cache().take(5)

1 刘备 68 蜀国
2 马超 90 蜀国
3 黄忠 91 蜀国
4 魏延 76 蜀国
5 姜维 92 蜀国
6 关羽 96 蜀国
7 严颜 78 蜀国
8 孟达 64 蜀国
9 张飞 88 蜀国
10 马谡 76 蜀国
11 赵云 95 蜀国
12 法正 88 蜀国

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值