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 rangeat 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 蜀国