2.4.3 位运算

参考:

  1. 所有offer题目的LeetCode链接及python实现
  2. github Target offer

概念

位运算是把数字用二进制表示之后,对每一位上0或者1的运算。
总共只有五种运算:与、或、异或、左移和右移。

  1. 左移运算符m<<n:表示把m左移n位。左移n位的时候,最左边的n位将被丢弃,同时在最右边补上n个0。
    比如:00001010<<2=00101000
  2. 同理,右移运算符m>>n表示把m右移n位。比如:10001010<<3=01010000
    • 特殊地,如果数字是一个有符号数值,则用数字的符号位填补最左边的n位
    • 如果数字原先是一个正数,则右移之后在最左边补n个0
    • 如果数字原先是负数,则右移之后在最左边补n个1

把整数右移一位和把整数除以2在数学上是等价的,那上面的代码中可以把右移运算换成除以2吗?

  • 答案是否定的。因为除法的效率比移位运算要低得多,在实际编程中应尽可能地用移位运算符代替乘除法

面试题10:二进制中1的个数

题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。

思路解析

1 可能会引起死循环

原始 n 循环地左移一位和右移一位的方法,因为Python不会出现整数溢出的情况,这里就不再考虑着两种方法。

2 聪明: n = n &amp; ( n − 1 ) n = n\&amp;(n-1) n=n&(n1)
  • 注意:每个非零整数n和n-1进行按位与运算 n &amp; ( n − 1 ) n \&amp; (n-1) n&(n1),整数n的二进制数中最右边的1就会变成0
  • 那么二进制数中的1的个数就会减少一个,因此可以利用一个循环,使得 n = n&(n-1) ,计算经过几次运算减少到0,就是有几个1
def NumberOf1InBinary(n):
	cnt = 0
	if n < 0:
		# 十六进制,8个f
		n = n&(0xffffffff)
	while n:
		n = n & (n-1)
		cnt += 1
	return cnt

或者调用python的元方法,直接求出二进制字符串,并且使用count计数。

def NumberOf1InBinary(n):
	cnt = 0
	if n < 0:
		# 十六进制,8个f
		n = bin(n&(0xffffffff))
	while n:
		n = bin(n)
	return n.count('1')

扩展题目1

用一条语句判断一个整数是不是2的整数次方。
解析:
一个整数如果是2的整数次方,那么它的二进制表示中有且只有一位是1,而其他所有位都是0。
由上一个题目可知,符合 n &amp; ( n − 1 ) = 0 n \&amp; (n-1)=0 n&(n1)=0.

扩展题目2

输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n。
解析:
第一步求这两个数的异或,第二步统计异或结果中1的位数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用:#pragma warning(disable:4996) #pragma warning(disable:4101) #pragma warning(disable:4244) #pragma comment(lib,"winmm.lib") #pragma comment(lib,"Ws2_32.lib")。引用:void main() { gtime_t ts = { 0 }, te = { 0 }; prcopt_t opt = prcopt_default; solopt_t sopt = solopt_default; filopt_t fopt = { 0 }; char* infile[] = { {"D:\\rtklibStudy\\testdata\\07590920.05o"}, {"D:\\rtklibStudy\\testdata\\30400920.05o"}, {"D:\\rtklibStudy\\testdata\\07590920.05n"} }; char* ofile = "D:\\my_rtklib\\mypos.pos";。引用:调试->my_rtklib调试属性->配置属性->C/C ->SDL检查,选择否。 。 根据引用和引用的内容,rtklib2.4.3是一个软件库,它提供了全球导航卫星系统(GNSS)数据处理的功能。通过引用中的示例代码可以看出,rtklib2.4.3可以用于处理GNSS测量数据,包括读取输入文件、设置选项、计算解算结果,并将结果输出到指定文件。 在使用rtklib2.4.3时,可以根据需要进行编译和调试。根据引用的内容,可以通过#pragma warning指令禁用特定的编译警告。根据引用的内容,可以在调试属性设置中选择是否进行SDL检查。 总结起来,rtklib2.4.3是一个用于处理GNSS数据的软件库,可以进行数据读取、选项设置、解算计算等操作,并可以通过编译和调试进行定制和优化。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [用VS2019进行RTKLIB2.4.3调试的两种方法](https://blog.csdn.net/qq_44296563/article/details/124537633)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值