位运算

LTC6904与PIC18F67K40构建高精度可编程方波发生器 在嵌入式系统设计中,精确时序控制是核心需求之一。可编程时钟发生器通过数字接口动态调整频率,相比传统晶振方案具有显著优势。其工作原理基于数字模拟转换器(DAC)控制电流源,配合温度补偿电路实现高稳定性。这类技术在工业自动化、精密测量等领域有广泛应用,特别是需要动态调整频率或多通道同步的场景。LTC6904作为典型代表器件,配合PIC18F67K40微控制器可构建高性价比解决方案,支持1kHz-20MHz宽范围输出,精度可达±0.1%。该方案通过I2C接口实现灵活控制,仅需少量外围元件,特别适合替代昂贵专用时钟 阅读详情

位运算

位运算是计算机中的基础运算单元,Java为了提高程序的运行性能,便可直接通过位运算符进行计算操作。

Java中提供的位运算符由擦欧总书和位运算符所组成,可以实现对数值类型的二进制数进行运算(在Java中所有数据都是以二进制数据的****形式进行运算的),在位运算中提供有两类运算符:逻辑运算符(~、&、|、^)和移位运算符(>>、<<、>>>),如下所示:

逻辑运算符描述
&按位“与”
|按位”或“
^异或(相同为0,不同为1)
~取反
移位运算符描述
<<左移位
>>右移位
>>>无符号右移位

逻辑运算符可与等号“=”联合使用,以便于更加简便地运算和赋值,即**“&=”、“|=”、“^=”都是合法的**(但由于**“~”是一元操作符**,所以不能与等号“=”连用)。

移位运算符均可与等号“=”联合使用,即**“<<=”、“>>=”、“>>>=”都是合法的**。此时,操作数左边的值会移动由右边数值指定的位数,再将得到的结果赋值给左边的变量。


1、十进制转化为二级制

十进制数据转化为二进制数据的原则为数据除以2取余数,最后倒着排列,例如,25的二进制值为11001,如下:

  • 25/2 = 12——余数1
  • 12/2 = 6 ——余数0
  • 6 /2 = 3 ——余数0
  • 3 /2 = 1 ——余数1
  • 1 /2 = 0 ——余数1

倒着排列余数便可得11001。但是值得注意的是,Java的int型数据为32位(4字节),所以实际最终的数据为00000000 00000000 00000000 0011001。

范例:

public class TestDemo {
    public static void main(String[] args) {
        int x = 13;
        int y = 7;
        System.out.println(x & y);  // 5
        System.out.println(x | y);  // 15
        System.out.println("x左移位后的计算结果:" + (x << 2));   // 52
        System.out.println("原变量x执行移位后的结果:" + x);      // 13 由此可得,移位后原来的值不变
    }
}
/*
结果分析:
13 的二进制:00000000 00000000 00000000 00001101  
7 的二进制:00000000 00000000 00000000 00000111   
& 的结果:00000000 00000000 00000000 00000101       转换为十进制:5
| 的结果:00000000 00000000 00000000 00001111       转换为十进制:15
<< 2 的结果:00000000 00000000 00000000 00110100    转换为十进制:52
*/

2、右移位(>>)与无符号右移位(>>>)的区别

在计算机中,数值表示正负是通过+、-来表示的:0–正,1–负

  1. 有符号右移 >>(正数,高位补0;负数,高位补1)
  • 正数:4 >> 2
    4 的二进制数(原码、补码、反码都相同):00000000 00000000 00000000 00000100

    4 >> 2(高位补0):00000000 00000000 00000000 00000001 转化为十进制:1

    tips:x >> n 的结果就是 【x / (2^n)】

  • 负数:-4 >> 2(高位补1)

    -4 的 原码:10000000 00000000 00000000 00000100(负数–>最高位为1)

    -4 的 补码:11111111 11111111 11111111 11111100

    负数原码 --> 补码:保证符号位不变,其余位置取反加1(或者 从右往左第一个1右边不变,左边全部取反)

    -4 >> 2(高位补1):11111111 11111111 11111111 1111111

    转化为原码(保留符号位,按位取反加上1):10000000 00000000 00000000 00000001 转化为十进制:-1

  1. 无符号右移 >>> (不论正负,高位均补0)
  • 正数:4 >>> 2

    同 4 >> 2 的运算相同,结果为:1

  • 负数:-4 >>> 2
    -4 的 原码:10000000 00000000 00000000 00000100(负数–>最高位为1)

    -4 的 补码:11111111 11111111 11111111 11111100

    -4 >>> 2(高位补0): 00111111 11111111 11111111 11111111 转化为十进制:1073741823

public class TestDemo {
    public static void main(String[] args) {
        int x = 4;
        int y = -4;
        
        System.out.println(x + "<< 2 : " + (x << 2));       // 16
        System.out.println(x + ">>> 2 : " + (x >>> 2));     // 1
        System.out.println(x + ">> 2 : " + (x >> 2));       // 1
        System.out.println(y + ">>> 2 : " + (y >>> 2));     // 1073741823
    }
}

3、移位运算符的一些疑难点

3.1 对于“取移动位数(二进制形式)右端的低5位作为实际移动位数”

《Java编程思想》这本书中提到:如果对char、byte 或者 short类型的数值进行移位处理,那么在移位进行之前,它们会被转换为int类型,并且得到的结果也是一个int类型。只有数值右端的低5位才有用。这样可以防止我们移位超过int型值所具有的位数。(译注:因为2的5次方为32,而int型值只有32位)若对一个long类型的数值进行处理,最后得到的结果也是long。此时只会用到数值右端的低6位,以防止移位超过long型数值具有的位数。

对于上面这段话,我个人的理解是:移位运算符的运算对象是基本数据类型中的单个“比特”(bit),即二进制数。而int类型是32位(2^5=32),若移位32位以上,那么原来的数会丢失其信息,显然没有什么意义。故移位运算符右端的数(转换为二进制)的低5位才有用。而对于long类型也是同理。例如,对于一个int型,x << y:

  • 若 y < 32,移位后的结果显然在意料之内

  • 若 y > 32,超过了int类型所能表示的范围,此时,先将y转换为二进制数并取该数的低5位(此低5位转换的十进制数就是要对x移动

    的位数)

public class TestDemo {
    public static void main(String[] args) {
        int i = 2;
        
        System.out.println("i的二进制数:" + Integer.toBinaryString(i));
        System.out.println("i的十进制数:" + i);

        System.out.println("i << 31 二进制数:" + Integer.toBinaryString(i << 31));
        System.out.println("i << 31 十进制数:" + (i << 31));

        System.out.println("i << 32 二进制数:" + Integer.toBinaryString(i << 32));
        System.out.println("i << 32 十进制数:" + (i << 32));

        System.out.println("i >> 33 二进制数:" + Integer.toBinaryString(i << 33));
        System.out.println("i >> 33 十进制数:" + (i << 33));
    }
}
/*
输出结果:
i的二进制数:10
i的十进制数:2

i << 31 二进制数:0
i << 31 十进制数:0

i << 32 二进制数:10
i << 32 十进制数:2

i >> 33 二进制数:100
i >> 33 十进制数:4
*/

上述例子,i << 33,对i左移33位时,先将i转换为二进制数:00000000 00000000 00000000 00000010,33的二进制数:00000000 00000000 00000000 00100001(取其右端低5位,即00001,转换为十进制数为1),故等价为i << 1,实际上是对i左移1位。

tips:被移位的int类型数值为x,x >> n(或x << n),则实际移动的位数为:n % 32。

3.2 “无符号”右移位操作符结合赋值操作对byte、short类型数值的移位运算

《Java编程思想》这本书中提到:“移位”可与“等号”(<<=或>>=或>>>=)组合使用。此时,操作符左边的值会移动由右边的值指定的位数,再将得到的结果赋给左边的变量。但在进行“无符号”右移位结合赋值操作时,可能会遇到一个问题:如果对byte或short值进行这样的移位运算,得到的可能不是正确的结果。它们会先被转换为int类型,再进行右移操作,然后被截断,赋值给原来的类型,在这种情况下可能得到-1的结果。

对于上面这段话,我个人的理解是(注:byte类型的分析同short类型):

  1. short类型的>>>操作:

    • short类型值为-1,转换为二进制数:11111111 11111111

    • Integer.toBinaryString(s1)会把s1转为int类型,故打印结果为:11111111 11111111 11111111 11111111

    • Integer.toBinaryString(s1 >>> 10),根据原文可知,会将short类型的s2转换为int类型,再无符号右移10位

    • 移位后得到:00000000 00111111 11111111 11111111

    • 然后直接返回int类型,故打印结果为:111111 11111111 11111111

  2. short类型的>>>=操作:

    • short类型值为-1,转换为二进制数:11111111 11111111

    • Integer.toBinaryString(s2)会把s1转为int类型,故打印结果为:11111111 11111111 11111111 11111111

    • 执行s2 >>>= 10,根据原文可知,会将short类型的s2转换为int类型,再无符号右移10位

    • 移位后得到:00000000 00111111 11111111 1111111(之后再截断出后16位赋给s2,得:11111111 11111111)

    • 打印的时short类型的s2又被转换为int类型,故打印结果为:11111111 11111111 11111111 11111111

public class TestDemo {
    public static void main(String[] args) {
        short s1 = -1;
        // 11111111 11111111 11111111 11111111
        System.out.println("s1: " + Integer.toBinaryString(s1));  
        
         // 111111 11111111 11111111
        System.out.println("s1 >>> 10: " + Integer.toBinaryString(s1 >>> 10)); 

        short s2 = -1;
        // 11111111 11111111 11111111 11111111
        System.out.println("s2: " + Integer.toBinaryString(s2));    
        
        s2 >>>= 10;
        // 11111111 11111111 11111111 11111111
        System.out.println("s2 >>>= 10: " + Integer.toBinaryString(s2));    
        
        // 11111111 11111111 11111111 11111111
        //System.out.println("s2 >>>= 10: " + Integer.toBinaryString(s2 >>>= 10));
    }
}
/*
输出结果:
s1: 11111111111111111111111111111111
s1 >>> 10: 1111111111111111111111
s2: 11111111111111111111111111111111
s2 >>>= 10: 11111111111111111111111111111111
*/

tips:简而言之,short、byte类型在进行“>>>=”操作时,需截断赋值。那么移动几位才不出现此现象呢?答案便是:大于等于17位。

以“short a = -1; a >>>= 17”为例: 则有

11111111 11111111 11111111 11111111 ——> 00000000 00000000 01111111 11111111

再将运算得到的int类型的结果赋值给short类型的变量a

00000000 00000000 01111111 11111111 ——> 01111111 11111111

转换为十进制数为,即a = 32767。

public class TestDemo {
    public static void main(String[] args) {
        short b = -1;
        System.out.println("b的二进制数: " + Integer.toBinaryString(b));
        System.out.println("b >>>= 16: " + Integer.toBinaryString(b >>>= 16));
        System.out.println("b的十进制数: " + b);

        short a = -1;
        System.out.println("a的二进制数: " + Integer.toBinaryString(a));
        System.out.println("a >>>= 17: " + Integer.toBinaryString(a >>>= 17));
        System.out.println("a的十进制数: " + a);

        short c = -1;
        System.out.println("a的二进制数: " + Integer.toBinaryString(a));
        System.out.println("c >>>= 17: " + Integer.toBinaryString(c >>>= 18));
        System.out.println("c的十进制数: " + c);
    }
}

/*
输出结果:
b的二进制数: 11111111111111111111111111111111
b >>>= 16: 11111111111111111111111111111111
b的十进制数: -1

a的二进制数: 11111111111111111111111111111111
a >>>= 17: 111111111111111
a的十进制数: 32767

a的二进制数: 111111111111111
c >>>= 17: 11111111111111
c的十进制数: 16383
*/

[算法]——常见位运算总结 本文介绍了常见的位运算及其组合,并辅以例题帮助读者更好地理解和应用 阅读详情

相关推荐

EEG | CHB-MIT癫痫数据集CNN分类实战(一)

CHB-MIT癫痫数据集CNN分类实战

Always learn from the best. 1万+

C语言中的移位操作(逻辑移位和算…

算术移位和逻辑移位主要是针对右移而言算数移位是会用符号位作为填充,逻辑移位不填充直接补零      左移时总是移位和补零。右移时无符号数是移位和补零,此时称为逻辑右移;而有符号数大多数情况下是移位和补最左边的位(也就是补最高有效位即符号位),移几位就补几位,此时称为算术右移。 例: 127的补码:0111 1111 (127>>1) 右移一位: 0011 1111   -> 原码同补码一样  对应

lovehere33的专栏 3015

使用Docker搭建SearXNG搜索引擎

【代码】使用Docker搭建SearXNG搜索引擎。

janthinasnail的博客 1157

位运算之左移右移运算之详解

先看如下一段左移右移的代码及其结果: 代码 #include "stdio.h"char leftshift(char i, int n){ if(n < 0) return -1; return i<<n;}char rightshift(char i, int n){ if(n < 0) return -1; ...

weixin_30668887的博客 3094

射频接收机本振相噪指标计算:从倒易混频到GSM实战

在射频接收机设计中,相位噪声是衡量本振信号频谱纯度、影响系统灵敏度的关键指标。其核心影响机制源于倒易混频原理:当不纯净的本振信号与强带外阻塞信号混频时,本振的噪声边带会被转换到中频通带内,从而抬升接收机噪声基底。这一过程直接决定了接收机在阻塞测试等场景下的性能极限。从技术价值看,精确计算本振相噪要求,是进行系统噪声预算、实现成本与性能权衡的核心依据。尤其在手机、基站等对灵敏度要求极高的应用中,它指导着锁相环和压控振荡器的选型与设计。本文以经典的GSM DCS1800标准为例,通过详细的公式推导与变量分析,演

weixin_30368405的博客 325

人形机器人专题:人形机器人关节,从Optimus选型看关节的发展

今天分享的是深度研究报告:《(报告出品方:中泰页。

GPT20236688的博客 3223

移位运算

位运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制位的问题。C语言提供了6个位操作运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。   C语言提供的位运算符列表: 运算符   含义     描述 &         按位与   如果两个相应的二进制位都为1,则该位的结果值为1,否则为0 |        按位或 

93Capricorns的博客 989

重磅!AI实时读取总结微信聊天记录,附MCP协议+智能体配置教程!

【摘要】本文介绍了一套AI实时分析微信聊天记录的解决方案,通过Chatlog+Trae+MCP协议实现智能整理群聊信息。Chatlog作为开源工具本地解析微信数据,确保隐私安全;Trae提供AI分析能力,支持自然语言处理。操作步骤包括:1)下载运行Chatlog并启动HTTP服务;2)安装Trae配置MCP协议;3)创建智能体设置提示词。该方案虽需初始配置,但能有效解决群聊信息过载问题,自动提炼关键内容,避免有价值信息被淹没。文中提供了详细教程链接和网盘资源。

puyihuan的博客 1万+

初级--06---位图

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录位图定义:>> 6的含义>> 6 等于 /64右移6位 等同于 除以64,也就是除以 2^6的意思取模运算 转化为 位运算==a%b = a&(b-1) ,且b=1< 位图 定义: 位图,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。 位图,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。

时光里的博客 435

ctfshow---sql注入(171-213)

这里提一句,为什么不直接替换成acb这种,因为,flag原本就有字母,还原的时候会全部都还原成数字的,数字替换成符号应该也是可以的,这边测试了下除了&#好像别的符号都可以。插入查询后查询语句就会变成这样,由于id=11111这是一个不存在的id,而后面1=1又为真,所以会查询到表内所有的内容,--+是注释后面的字符。因为接受username的时候没有用引号,所以接受单纯的数字,而数字和字符比较会转换类型,字符串会变成数字0进行比较,所以相等。

fainpo的博客 1320

matlab 三维绘图 抛光,瓷砖抛光过程建模与仿真

:瓷砖抛 光过程 建模与仿真朱 成 就(广 东工业大学 机 电工程 学院, 广东广州 )摘要 :瓷砖的抛磨影响 因素众 多 ,实际磨削加工时容易出现漏抛 、返抛现象 。对陶瓷抛光机磨头进行运动学分析 ,并基于不 同粒度号 的磨 粒在一定压力下的加工深度模型 ,探讨抛光机磨 头转 速 、横梁摆动频率 、传送速度对瓷砖抛光加工表 面均匀性 的影响,然 后结合 磨削机理使 用 对陶瓷抛光过程进行仿真 ...

weixin_36331058的博客 747

位运算全面总结,关于位运算看这篇就够了

关于位运算的奇技淫巧,看完这篇你就能灵活使用位运算了。

pursuit的博客 12万+

36 Agent Memory:如何让智能体记住该记的东西

Agent 会调用工具,只能说明它有了行动能力。要让它跨会话、跨任务持续工作,还需要一套可治理的 Memory 系统。本文讲清上下文窗口、RAG 和 Agent Memory 的区别,以及工作记忆、情景记忆、语义记忆、程序记忆该如何分层设计。

老于的笔记的专栏 88

说一说位运算

位运算是什么?‘&’、 ‘|’ 、‘^’、‘~’这些符号是啥意思?快来看看位运算的基础知识吧,文末链接有进阶,学习更快乐!

Sdom_L的博客 6053

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【优选算法 & 位运算】位运算算法入门详解:位运算小专题

【优选算法 & 位运算】位运算算法入门小专题:判定字符是否唯一丢失的数字;两整数之和;只出现一次的数字Ⅱ;消失的两个数字;

OuO-1 的博客 3147

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

位运算各种方法总结

位运算1、按位与2、按位或3、按位取反4、按位异或5、按位同或6、左移7、带符号右移8、无符号右移9、python实现各种位运算操作 \quad \quad现代计算机中,几乎都是二进制计算机(三进制计算机仅有少量),所有的数据都以二进制的形式存储在设备中。位运算就是直接对整数在内存中的二进制位进行操作。 \quad \quad需要注意,位运算是针对 二进制 的运算,对每一个位进行布尔运算操作。所以 手动 进行 位运算计算 时,需要将数转换成二进制的表示形式,再进行计算。 1、按位与 \quad \quad只

weixin_45666566的博客 7959

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

位运算的总结

这里我们运用集合与集合的思想,n ,k为两个不同的集合,如果可以使 n 修改为 k,我们是从 n 中去掉元素使其等于 k,那么 k 应该为 n 的子集。要删除最小的元素即为删除最右边的 1。这个题目和之前的类似,只是多了一个可以增加元素的操作,所以仍然是按位异或得到集合 s,这个集合包含 state 中独有的 (需要删除的元素) 和 goal 中独有的 (需要添加的元素)这里是要取两个集合的交集,我们可以用 set 来去重,把两个数组中的元素均存入 set 中,然后减去 set 的大小即为重复元素的数量。

a140781的博客 1714

位运算及其应用

1.位运算优势以及优先级2.位运算和逻辑运算符的对比3.位运算的应用(获取最后一位,快速取模,交换两数,幂运算等等)

zsgmer的博客 2724

位运算(1)_常见位运算总结

新的算法专栏出炉--位运算,位运算(1)_常见位运算总结,感兴趣的宝子们千万不要错过哦!!! 下篇让初步掌握位运算的五道题

wer24_25的博客 1781

位运算算法

于是我们可以像下面这样,一个比特位代表一个字母,这样子我们只要26个比特位就能表示出所有的小写字母,我们让0代表该字母没出现过,1代表该字符出现过。然后,当我们对这个取反后的数加1时,会从最低位(最右侧)开始,遇到第一个0时停止进位,并将这个0及其之后的所有位都设置为1,而之前的所有位都保持不变(但由于是取反后的数,所以它们实际上是原数中对应位置的相反值)。假设我们有一个数 n = 29,并且我们想知道它的二进制表示中的第 x = 3 位(从右向左,从0开始编号)是0还是1。位(从0开始计数)修改成1。

2301_80224556的博客 2029

简记位运算

《位运算小结》   位运算的重要程度从各种课本上就能感受到,毕竟计算机只认识二进制,在工作当中位运算也是能够提高效率的利器。比如汉明距离就用到了异或运算以及查找位1的个数相关的位运算,如果不了解这些而单纯使用循环的话,那效率就大打折扣了。 Key Words:位运算、与、或、异或、取反、位移运算 Beijing, 2020 作者:RaySue Code: Agile Pioneer   位运算   计算机内存中都是以二进制形式存储的。位运算就是直接对整数在内存中的二进制位进行操作。由.

雄关漫道真如铁 而今迈步从头越 4520

详解位运算

位运算是基于整数的二进制表示进行的运算。由于计算机内部就是以二进制来存储数据,位运算是相当快的。它直接对整数的二进制位进行操作。位运算符作用于位,并根据每一位是0还是1来产生结果。基本的位运算共 6 种,分别为按位与(AND)、按位或 (OR)、按位异或 (XOR)、按位取反(NOT)、左移和右移。

weixin_73964795的博客 2112

编程基础:位运算01,位运算引言

编程基础:位运算

2401_82825368的博客 1408

【算法详解】位运算

在计算机内部,数是以「二进制(Binary)」的形式来进行存储。位运算就是直接对数的二进制进行计算操作,在程序中使用位运算进行操作,会大大提高程序的性能。

Z1tai的博客 1901
下一篇: String类的常见问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

窝在角落里学习

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

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

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

打赏作者

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

抵扣说明:

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

余额充值