左移 和 右移

今天碰到一个左移和右移的问题。代码如下:

116 在 内存中的表现形式为 01110100

所以我认为上述语句执行完成之后,b 为 112(即01110000),c 为 4(即00000100)

但是打印出的结果却是: b = 112, c = 116

很是奇怪,c 的值为什么跟 a 一样,没有变化?

 

后来改代码如下:

此时才得到正确的结果,b = 112, d = 4

 

      于是猜想在进行 (a << 4) >> 4 的时候,编译器先把 a << 4 的结果存放到一个临时变量 temp 中,而该变量 temp 却为 int 型,

所以此时 temp 的值为 011101000000,再把 temp >> 4,变为 01110100,故执行完 (a << 4) >> 4 后,c 的值跟 a 的值相

等。

### 左移右移操作的作用及实现强制输出16位数值的方法 #### **左移右移的操作及其作用** 在编程中,左移(`<<`)右移(`>>`)属于位运算符的一种。这些操作通常应用于整数类型的变量上,通过对二进制位的移动来改变数据的内容或进行优化计算。 - **左移操作**:将指定的数据按位向左移动若干位,低位补零。这相当于乘以2的n次方(n为移动的位数)。例如,在C语言或其他支持相同语义的语言中: ```c int value = 5; // 二进制表示为 00000101 int shiftedValue = value << 1; // 结果为 10 即 00001010 ``` - **右移操作**:将指定的数据按位向右移动若干位,对于无符号数来说高位补零;而对于有符号数,则取决于具体的硬件架构或者编译器设置,可能采用算术右移(保留符号位扩展到新位置),也可能采用逻辑右移(始终填入零)。例如: ```c int value = -8; // 假设32位系统下,二进制表示近似为 ...1111111111111000 int arithmeticShiftedValue = value >> 1; // 如果是算术右移,结果仍保持负号特性 ``` 以上描述总结了基本概念并给出了简单的例子[^3]。 --- #### **实现强制输出16位数值的方法** 为了确保任何整数值都能被格式化为固定长度的16位十六进制形式展示出来,不同程序设计语言提供了各自的解决方案。以下是几种常见语言的具体做法: --- ##### **C/C++** 利用printf系列函数中的格式控制符能够方便地达到目的。“%#018x”意味着打印出一个带有‘0x’前缀的小写字母组成的十六进制串,并且整个表达式的宽度至少要占据18个字符空间,不足的部分自动用前置零补齐。 ```cpp #include <cstdio> int main(){ unsigned short num=65535; printf("%#018x\n",num); // 输出形如: 0x0000ffff } ``` 这里注意因为我们需要的是纯16bit所以选用unsigned short类型作为存储容器更合适一些[^1]. --- ##### **Python** Python内置强大的字符串格式化能力使得这样的需求变得异常简洁明快。无论是传统的百分号风格还是现代化f-string均能很好地胜任这项工作。 传统方式: ```python value = 4096 formatted_value = "%#.4x"%value.zfill(16//len(hex(value))-2+len('0x')) print(formatted_value) # 可能得到类似 '0x00001000' ``` 推荐的新式f-string: ```python value = 4096 formatted_value=f"{hex(value)[2:].zfill(16)}" print(f"0x{formatted_value}") # 输出应该是'0x0000000000001000' ``` 另外还可以直接调用format方法完成同样效果:`'{:#0{}x}'.format(num,18)`[^2]. --- ##### **Java** Java里也有相应的API帮助开发者快速构建自定义格式化的数字呈现方案。下面给出一段示范代码片段: ```java public class Main{ public static void main(String []args){ Integer val=new Integer((short)-1); System.out.printf("0x%016x%n",val.longValue()); } } ``` 此处特别强调一点就是当处理涉及符号扩展的情况时需格外小心,由于Java默认所有整形常量都是int型除非显式声明其他大小因此如果想精确操控较小尺寸的数据最好先转成长整型再做进一步加工以免丢失重要信息[^4]. --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值