位操作(Bitwise Operation)

2024-09-04 11:04
文章标签 operation 位操作 bitwise

本文主要是介绍位操作(Bitwise Operation),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

位操作(Bitwise Operation)是一种直接对整数的二进制位进行操作的计算方法。在计算机中,数据通常以二进制形式存储,位操作允许我们直接操作这些二进制位。位操作通常比常规的算术运算更高效,因为它们直接作用于二进制位而不涉及更复杂的计算。

常见的位操作符

1.按位与(&):
对应位都为1时,结果为1,否则为0。
例如:1010 & 1100 = 1000

2.按位或(|):
只要对应位有一个为1,结果就为1。
例如:1010 | 1100 = 1110

3.按位异或(^):
对应位不同,结果为1;相同,结果为0。
例如:1010 ^ 1100 = 0110
特点:任何数与0异或都不变,任何数与自己异或都变成0。

4.按位取反(~):
将每一位的0变成1,1变成0。
例如:~1010 = 0101(具体结果取决于机器字长)

5.左移(<<):
把一个数的二进制位全部向左移动若干位,右边补0。
例如:1010 << 2 = 101000(即乘以2的幂)

6.右移(>>):
把一个数的二进制位全部向右移动若干位,左边补0或符号位(符号位取决于是有符号右移还是无符号右移)。
例如:1010 >> 2 = 0010(即除以2的幂)

应用

位操作非常适合用来处理涉及二进制的场景,如:

权限控制: 使用位掩码(bitmask)来管理多个权限。
数据压缩: 通过位操作可以将多个小数据压缩到一个整数中。
加密与校验: 利用按位异或进行简单的加密和校验。
性能优化: 位操作常常比同等功能的常规操作更高效。

示例

例如在问题“找出数组中只出现一次的元素”中,我们使用了按位异或(^)操作的特性:

如果一个数在多个位置出现偶数次,经过多次异或后会被抵消为0。

唯一一个出现一次的数,不会被抵消掉,因此异或后结果就是这个数。

通过这些操作,我们能在高效的时间和空间复杂度下解决各种问题。
leetcode 137.链接只出现一次的数字
给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。

public class SingleNumber {public int singleNumber(int[] nums) {int ones = 0, twos = 0;for (int num : nums) {// 计算ones,当twos不包含num时,ones ^= numones = ones ^ num & ~twos;// 计算twos,当ones不包含num时,twos ^= numtwos = twos ^ num & ~ones;}// ones就是只出现一次的数字return ones;}public static void main(String[] args) {SingleNumber solution = new SingleNumber();int[] nums1 = {2, 2, 3, 2};System.out.println(solution.singleNumber(nums1));  // 输出:3int[] nums2 = {0, 1, 0, 1, 0, 1, 99};System.out.println(solution.singleNumber(nums2));  // 输出:99}
}

我看不懂,只能硬记

这篇关于位操作(Bitwise Operation)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1135841

相关文章

[LeetCode] 583. Delete Operation for Two Strings

题:https://leetcode.com/problems/delete-operation-for-two-strings/description/ 题目 Given two words word1 and word2, find the minimum number of steps required to make word1 and word2 the same, where in

macos 系统文件操作时提示 Operation not permitted 异常解决方法 , 通过恢复模式 开启 /关闭 SIP方法

在macos系统中操作系统文件时提示 Operation not permitted  这个异常, 原因是因为在macos 10.11以上版本中默认启用了 SIP( System Integrity Protection )机制对系统文件进行保护,  要解决这个问题我们需要关机, 然后进入mac的恢复模式 :  在按电源键开机的同时, 一直按住 command + r 键 直到出现恢复模式界面后松

电脑开机出现no operation system found错误原因分析及解决方法

最近有网友问我电脑一启动提示:no operation system found,这个提示意思是未找到操作系统。并且出现bios能认别硬盘,快捷启动时找不到硬盘,出现该提示的原因有很多,下面我们来详细分析一下开机出现no operation system found解决方法全集。 电脑开机出现no operation system found错误原因分析及注意事项: 电脑开机时出

【LINUX】“dmesg: read kernel buffer failed: Operation not permitted“ 错误

出现 “dmesg: read kernel buffer failed: Operation not permitted” 错误通常是因为当前用户没有权限读取内核日志缓冲区 这可以通过修改内核参数 kernel.dmesg_restrict 来解决。 你可以尝试以下命令来允许非特权用户读取内核日志: sudo sysctl -w kernel.dmesg_restrict=0 这个命令

关于位结构体及位操作总结

#include <stdio.h>#pragma pack(1)struct stu{char a:4; // a占用char的低4位 char b:4; // b占用char的高4位(注意,这里实际上是与a共享同一个char的空间) };#pragma pack(4)int main(){struct stu s={.a=2, //a:0010.b=3, //b:00

rl: (7) Failed to connect to get.rvm.io port 443: Operation timed out

问题:curl -L https://get.rvm.io | bash -s stable 命令失败 报错内容: rl: (7) Failed to connect to get.rvm.io port 443: Operation timed out 或 curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection t

使用位操作高效解决单个元素出现问题【位运算】

使用位操作高效解决单个元素出现问题 在日常的算法面试和编程挑战中,常常会遇到寻找单个出现元素的问题。尽管可以用哈希表(map)轻松解决,但要求更高效的线性时间复杂度和常量空间复杂度时,位操作特别是异或(XOR)运算提供了一个巧妙的解决方案。本篇博客将深入探讨这个问题,详细解释异或运算的特性,并展示其在解决该类问题中的强大作用。 问题描述: 给定一个非空整数数组,除了某个元素只出现一次以外,其

mac IDEA java 没有javap 安装 The operation couldn’t be completed. Unable to locate a Java Runtime.

一、直接从官网下载需要的JDK版本 https://www.jianshu.com/p/fe6b68295479   二、javap Error: class not found 1.用javac 类名 的命令生成class文件   2. 用javap -c 类名 命令进行拆解代码     https://blog.csdn.net/en_joker/article

qt6 socket 不使用代理 socket error: The proxy type is invalid for this operation

qt 5.8之后,socket默认使用代理 参考 https://www.cnblogs.com/cppskill/p/11730452.html#:~:text=%E5%9C%A8%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%E9%87%8C%E5%AE%9A%E4%B9%89,Proxy%29%3B%E3%80%82 #include <QNetworkProx