IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言之位运算 -> 正文阅读

[C++知识库]C语言之位运算

因为在前天的练习题中,涉及到了位运算,但我之前对位运算了解的不多,就查找总结了一下,写了这篇博客,巩固一下所学

C语言之位运算

一、位运算符

逻辑运算符操作移位运算符操作
&按位 “与”a << ba左移b位
^按位 “异或”a >> ba右移b位
|按位 “或”
~按位 “非”(取反)

PS:都是以位(bit)为单位

二、位运算

1. & 按位“与”运算

#include<stdio.h>
#include<stdlib.h>
int main(){
	unsigned char num1 = 170;			// 170 = 10101010
	unsigned char num2 = 85;			//  85 = 01010101
	unsigned char num3 = num1 & num2; 	// num1 & num2 = 00000000 = 0
	
	printf("num1 = %d \n", num1);
	printf("num2 = %d \n", num2);
	printf("num3 = %d \n", num3); 
	
	return 0;
} 

运行结果:
按位与运算

2. ^ 按位异或运算

#include<stdio.h>
#include<stdlib.h>
int main(){
	unsigned char num1 = 170;			// 170 = 10101010
	unsigned char num2 = 85;			//  85 = 01010101
	unsigned char num3 = num1 ^ num2;	// num1 ^ num2 = 11111111 = 255
	
	printf("num1 = %d \n", num1);
	printf("num2 = %d \n", num2);
	printf("num3 = %d \n", num3); 
	
	return 0;
} 

运行结果:

按位异或运算

3. | 按位或运算

#include<stdio.h>
#include<stdlib.h>
int main(){
	unsigned char num1 = 42;			//  42 = 00101010
	unsigned char num2 = 21;			//  21 = 00010101
	unsigned char num3 = num1 | num2;	// num1 | num2 = 00111111 = 63
	
	printf("num1 = %d \n", num1);
	printf("num2 = %d \n", num2);
	printf("num3 = %d \n", num3); 
	
	return 0;
} 

运行结果:
按位或运算

4. ~ 按位取反(非运算)

#include<stdio.h>
#include<stdlib.h>
int main(){
	unsigned short num1 = 255;		// 	 255 = 00000000 11111111
	unsigned short num2 = ~num1;	// 65280 = 11111111 00000000
	unsigned short num3 = ~num2;	// 	~255 = 11111111 00000000
	
	printf("num1 = %d \n", num1);
	printf("num2 = ~num1 = %d \n", num2);
	printf("num3 = ~num2 = %d \n", num3); 
	
	return 0;
} 

运行结果:

按位取反运算

5. >> 右移

#include<stdio.h>
#include<stdlib.h>
int main(){
	unsigned char num1 = 32;			//	32 = 00100000
	unsigned char num2 = num1 >> 1;		// 	00100000 -> 00010000 = 16
	unsigned char num3 = 64;			// 	64 = 01000000
    num3 >>= 2;							//	01000000 -> 00010000 = 16
	
	printf("num1 = %d \n", num1);
	printf("num2 = ~num1 = %d \n", num2);
	printf("num3 = ~num2 = %d \n", num3); 
	
	return 0;
} 

运行结果:

右移位运算

6. << 左移

#include<stdio.h>
#include<stdlib.h>
int main(){
	unsigned char num1 = 32;			//	32 = 00100000
	unsigned char num2 = num1 << 2;		// 	00100000 -> 10000000 = 128
	unsigned char num3 = 8;				// 	8 = 00001000
    num3 <<= 3;							//	00001000 -> 01000000 = 64
	
	printf("num1 = %d \n", num1);
	printf("num2 = ~num1 = %d \n", num2);
	printf("num3 = ~num2 = %d \n", num3); 
	
	return 0;
} 

运行结果:

左移位运算

三、位运算符优先级

优先级运算符结合方向
1- (符号运算符), ~ (取反运算符), ++ (自增), -- (自减)从右向左
2* (乘), / (除), % (取余)从左向右
3+ (加), - (减)从左向右
4<< (左移), >> (右移)从左向右
5> (大于), < (小于), >= (大于等于), <= (小于等于)从左向右
6== (等于), != (不等于)从左向右
7& (按位与)从左向右
8^ (按位异或)从左向右
9| (按位或)从左向右

四、位运算应用

功能位运算操作示例
去掉最后一位x >> 10010 -> 0001
在最后加一个0x << 10100 ?> 1000
在最后加一个1x<<1+10100 ?> 1001
将最后一位变为1x | 10100 ?> 0101,即和0…01相与,与0为0,与1为1
将最后一位变为0x|1 - 10101 ?> 0100, 这里实际上就是先确保最低位变为1,再减去1
最后一位取反x ∧ 10100 ?> 0101, 利用异或性质,其中除最后一位其余不变
把右数的第k位变为1x | (1<<(k - 1))0001 ?> 1001,k=4,即将第k位和1相或为1
把右数的第k位变为0x & ~(1<<(k ? 1))1001 ?> 0001, k=4, 这个操作实际上就是先将第k位变为1,然后取反得到第k位为0,其余位为1,最后利用按位与的性质其余位不变,第k位与0得0
把右数的第k位取反x ∧ (1<<(k ? 1))1000?>0000,k=4,利用异或性质
取末k位x & (1<<k ? 1)1011?>0011,k=2,即先得到0100,再-1得到0011,然后与x相与(得到一个后k为1,其余为0的数,再与x相与)
取右数的第k为x>>(k-1)&11000->0001,k = 4,右移k-1位则是去掉最后的k-1位,然后按位与1即可提出最后一位,即第k位
把末k位全变为1x | (1<<k - 1)1000?>1111, k=3,即与k位1相或
把右边连续的1变为0x & (x+1)0111-> 0000, 右起连续的1
把右起的第一个0变为1x|(x+1)0011->0111
右起连续的0变成1x|(x-1)1000 -> 1111
取右边连续的1(x ^ (x + 1))>>11011->0011
将右起第一个1的左边全变成0x & (x ^ (x - 1))1101-> 0001

原题目如下:

Leetcode-342

【描述】输入一个表示整数的字符串,判断这个字符串是否为4的幂

【输入】一个正整数字符串

【输出】返回true或false

【进阶】尽量不使用循环或递归来实现

4的幂次方一定是2的幂次方,但是反过来却不成立。例如,8是2的3次方,但并不是4的幂次方。

1转成2进制是1;
4转成2进制是100;
16转成2进制是10000;
64转成2进制是1000000;

4的幂次方的规律就是看这个数转成2进制后是不是所有位数只有1个1,并且这个1只能在奇数位上出现。

code:

class Solution {
public:
    bool isPowerOfFour(int num) {
        if(num == 1) return true;
        if(num <= 3) return false;
        int count = 0;
        int i = 1;
        while(num != 0){
            if((num&1) != 0 && (i&1) != 0){
                count++;
            }
            if((i&1) == 0 && (num&1) != 0){
                return false;
            }
            num >>= 1;
            i ++;
        }
        if(count == 1)
        return true;
        return false;
    }
};

位运算相较于循环嵌套等方法会简单一些

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 18:34:21  更:2022-07-20 18:37:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 12:22:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码