位运算

作者: HaughtyHH | 来源:发表于2020-02-18 00:39 被阅读0次

基本符号

& 与

A B L=A & B
0 0 0
0 1 0
1 0 0
1 1 1

| 或

A B L=A | B
0 0 0
0 1 1
1 0 1
1 1 1

^ 异或

A B L=A ^ B
0 0 0
0 1 1
1 0 1
1 1 0

~ 非

不理解Python的 ~ 运算符 。
~x=-x-1

>> 右移位

<< 左移位

>>> 填充高位

Python 没有此项操作。

注: Python 支持位运算符。
\qquadPython 数据保存格式为 10 进制, ^ 异或运算 先变为二进制,异或,保存时又会变成十进制。
\qquadPython 数据长度自行判断,不存在溢出,故 1 << 35 != 1 << 3 (C\C++\Java int 只有32位)。
\qquad不存在高位补零运算,如需实现此操作,需用 format 函数。
e.g.
>>> '{:08b}'.format(4)
'00 000 100'
注意: format 函数输出结果为字符串

位运算的小用途:

判断奇偶数用 & :

>>> 3 & 1
1
>>> 4 & 1
0

获取二进制位为 0 还是 1 :

>>> a = 5 # 二进制码为101
>>> i = int (input('请输入查询位: '))-1
3
>>> b = 2 ** i
>>> c = a & b
>>> if c != 0 :
\qquad \qquadc=1
>>> print(c)
1

不用判断语句,求整数绝对值。

此项功能 Python 无法实现,Python符号位不为最高位。其他语言实现思路为 最高位 & 0 。将符号位清空,返回其数值。

查找重复元素

1-1000这1000个数放置在含有1001个元素的数组中,只有唯一的一个元素重复,其它均只出现一次。每个数组空间只能访问一次。设计一个算法,将它找出来。不用辅助存储空间,能否设计一个算法实现?

# 生成1001位数列
import random
A=[]
a=0
for i in range(1,11):
\qquadA.append(i)
A.append(random.randint(1,10))
# 解法一
for i in range(len(A)): #1
\qquada=a^A[i]
for i in range(len(A)-1): #2
\qquada=a^A[i]
print(a)
# 偶数个相同异或为0,1和2相加,只有重复数为3个,输出只有重复位。awsl
# 解法二
''' 暴力破解 '''
B=[0]*11
for i in range(len(A)):
\qquadB[A[i]]+=1
for i in range(len(B)):
\qquadif B[i]>1:
\qquad\qquadprint(i)

以下几题为连续。

计算二进制数中有几个 1

a=int(input())
d=0
for i in range(5):
\qquadb=2**i
\qquadc=a&b
\qquadif c != 0 :
\qquad\qquadd+=1
print(d)

判断整数是不是 2 的整数次方

if d == 1 :
\qquadprint('Yes.')

一条语句判断一个整数是不是 2 的整数次方 '''

if (a-1)&a == 0 :
\qquadprint('Yes')

0~1 浮点实数的二进制表示

给定一个介于 0 和 1 之间的师叔,如 0.625 ,打印它的二进制表示(0.101) 若该数字无法精确地用32位以内的二进制表示,则打印 "ERROR" .

a=float(input('输入小数 :'))
op='0.'
for i in range(32):
\quada*=2
\quadif a>1:
\qquada-=1
\qquadop+='1'
\quadelif a==1:
\qquadop+='1'
\qquadprint(op)
\qquadexit(0)
\quadelse:
\qquadop+='0'
print('ERROR')

出现 k 次与出现 1 次

数组中只有一个数出现了 1 次,其他的数都出现了 k 次,请输出只出现了 1 次的数。

#方便的解法应该是运用:n 个 n 进制数做不进位加法,结果为 0 ,把输入数字转换位 k 进制,再进行不进位相加,最后留下的就是只出现了 1 次的数。但是没有想出 Python 怎样定义 n 进制算法。暴力万岁……
list=list(map(int,input('请输入数组:').split()))
A=[0]*10000
for i in range(len(list)):
\quadA[list[i]]+=1
for i in range(len(A)):
\quadif A[i] == 1 :
\qquadprint(i)
\qquadexit(0)

相关文章

  • 3、小众运算符の大课堂(一)

    较为简单の位运算符: & 位与运算| 位或运算^ 位异或运算~ 位取反运算 举例: 要做位运算,首先要把数据转...

  • 位运算及其应用

    内容概要: 位运算基本操作 基于位运算的状态压缩 位运算经典应用 位运算解N皇后问题 位运算 符号描述规则&与1&...

  • 位运算及用位运算实现权限控制

    请自行补习位运算相关知识 位运算 位运算示例 权限控制

  • 开发基础随笔之位运算符(Bitwise Operators)

    位运算符,属于算术运算符 按位逻辑运算符: 位移运算符: 位运算符的运算数只能是整数 位移运算符:按位左移 a<<...

  • 强大的位运算符

    位取反运算符 位取反运算符(~)是对所有位的数字进行取反操作位取反运算符.png 位与运算符 位与运算符(&)可以...

  • 位运算

    位运算 1. &:按位与 规律:一假则假任何位上的数和1相&得到的结果还是那个数 2. |:按位或 规律:一真则真...

  • 位运算

    https://leetcode.com/problems/gray-code/description/这个位运算...

  • 位运算

    位运算符比一般的算术运算符速度要快,而且可以实现一些算术运算符不能实现的功能。如果要开发高效率程序,位运算符是必不...

  • 位运算

    1.不用加减乘除做加法 解法:分为三步①各位相加不进位,即先按位异或;②做进位,按位与并左移位;③结果相加,直至没...

  • 位运算

    位运算不仅可以简化某些复杂的操作,而且具有更快的计算速度。典型的应用就是除法,交换两个数值,以及在一个数组中寻找只...

网友评论

      本文标题:位运算

      本文链接:https://www.haomeiwen.com/subject/wsswfhtx.html