记一次 python 截取高低位(>> 和 & 运算符)

记一次 python 截取高低位(>> 和 & 运算符)

.

首先我们要知道低字节和高字节:(左高右低)

在编程语言中,字符一般是占 16 位,8 位为一字节,所以有高位字节和低位字节。
在这里插入图片描述
.

一个16进制数有两个字节组成,例如:A9。
高字节就是指16进制数的前8位(权重高的8位),如上例中的A。
低字节就是指16进制数的后8位(权重低的8位),如上例中的9。
.

以两个个16进制数为例:
0x12,其中1是高字节,2是低字节;0x1234,其中1是高高字节,2是高字节,3是低字节,4是低低字节;
.

运算举例:

内存中的大端小端我们先不管,首先我们来看 0x1234,高 8 位是 0x12,低位是 0x34。
接着我们来看 0xff ,对齐来看就是 0x00ff,它对应的其实是 0x1234 中后面低位的 0x34。
.

也就是说如果 0x1234 & 0xff 的话,低位对低位生成的是 0x34:

#14.py
print(hex(0x1234&0xff))

在这里插入图片描述
.

有了前面知识后,下面演示如何在 0xabcdef 中分别取 0xab 0xcd 0xef:

#演示如何在 0xabcdef 中分别取 0xab 0xcd 0xef
print(0xab)
print(0xcd)
print(0xef)
print('第一-----------------')			#左高右低规则
print(bin(0xabcdef))
print(bin(0xff))
print(bin(0xABCDEF&0xff))
print(hex(0xABCDEF&0xff))				#0xef
print('第二-----------------')
print(bin(0xabcdef))
print(bin(0x00ff))
print(bin(0xabcdef&0x00ff))
print(hex(0xabcdef&0x00ff))			#0xef,注意0x0000ff和0xff都是一样的,前面的0是高位的0,都会被默认删去。
print('第三-----------------')
print(bin(0xabcdef))
print(bin(0xff00))
print(bin(0xabcdef&0xff00))
print(hex(0xabcdef&0xff00))			#0xcd00,因为高位截取后低位的00被空了下来,所以这样截取不了0xcd
print('第四-----------------')
print(bin(0xabcdef))
print(bin(0xff))						#0,这是移动了256位啊,都为0,并不能截取 0xcd
print(bin(0xabcdef>>0xff))
print(hex(0xabcdef>>0xff))
print('第五-----------------')
print(bin(0xabcdef))
print(bin(8))							#0xabcd,右移动8位,能除去低8位,但还是不能截取到0xcd
print(bin(0xabcdef>>8))
print(hex(0xabcdef>>8))
print('第六-----------------')
print(bin(0xabcdef))
print(bin(8))							#0xabcd00,左移运算符不起作用,不会把左边0xab丢弃,只会补齐0,因为python变量数据大小可扩充
print(bin((0xabcdef>>8)<<8))
print(hex(((0xabcdef>>8)<<8)))
print('第七-----------------')
print(bin(0xabcdef))
print(bin(8))							#0xab,python取高八位还是要用右移运算符啊!python变量数据大小虽然可扩充,但是右移还是会去除的。
print(bin(0xabcdef>>16))
print(hex(0xabcdef>>16))
print('第八-----------------')
print(bin(0xabcdef))
print(bin(8))							#0xcd,python取中八位是左移运算符和&0xff一起用才行
print(bin((0xabcdef>>8)&0xff))
print(hex((0xabcdef>>8)&0xff))
print('第九-----------------')

在这里插入图片描述
在这里插入图片描述
.
.

总结:

由于 python 变量数据大小可扩充,右移运算符 << 只会在左边补 0 ,并扩大了原数。但是左移运算符 >> 可以抛弃末尾的数。

python 截取高位、低位其实配合使用 >> 和 & 即可:
所以截取低位时直接 &0xXX 即可。
截取中位时先用左移运算符 >> 抛弃末尾的数,直到中位变成末尾,再用 & 截取新末尾即可。
截取高位时依旧是靠左移运算符 >> 把高位移动到末尾,再用 & 截取新末尾。

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
在C++中,可以使用运算和强制类型转换来将十六进制字节数组转换为十进制数。根据引用\[2\]和引用\[3\]的示例代码,可以总结出以下两种方法: 方法一:使用运算和强制类型转换 1. 定义一个十六进制字节数组,例如char hexBuf\[\] = {0x13, 0x14, 0x14, 0x16, 0x17, 0x16, 0x00}; 2. 定义一个目标变量,例如unsigned int decimalNum = 0; 3. 使用运算和强制类型转换将字节数组转换为十进制数,例如: decimalNum = (((((hexBuf\[0\] << 8) | hexBuf\[1\]) << 8) | hexBuf\[2\]) << 8) | hexBuf\[3\]; 4. 最后,decimalNum就是转换后的十进制数。 方法二:使用memcpy和强制类型转换 1. 定义一个十六进制字节数组,例如char hexBuf\[\] = {0x13, 0x14, 0x14, 0x16, 0x17, 0x16, 0x00}; 2. 定义一个目标变量,例如unsigned int decimalNum = 0; 3. 使用memcpy将字节数组的前几个字节复制到一个新的char数组中,例如: char headBuff\[4\]; memcpy(headBuff, hexBuf, 4); 4. 使用强制类型转换将新的char数组转换为十进制数,例如: decimalNum = *((unsigned int*)headBuff); 5. 最后,decimalNum就是转换后的十进制数。 需要注意的是,以上两种方法都假设字节数组的顺序是按照高位低位的顺序排列的。如果字节数组的顺序是按照低位高位的顺序排列的,需要相应地调整运算的顺序。 #### 引用[.reference_title] - *1* *2* *3* [C++常见十六进制数组转换char数组方法](https://blog.csdn.net/qq_43376782/article/details/127736693)[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^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐一 · 林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值