15.03.28-有意思的位运算

位运算的几个运算符 |(或) &(与) ~(非) ^(异或) >>(右移) <<(左移)

1.两次异或为本身

(可用于加密,两数字互换)

1001 ^ 1101 = 0100;0100 ^ 1101 = 1001;

2.移位运算的右移>>

一般机器支持两种右移:逻辑右移和算数右移。

逻辑右移在右边补0: x >> k  ==>  [0,...0,   xn-1,xn-2,...x0]

算术右移在右边补最高位有效值(0或1,这个在有符号数据中比较有用): x >> k  ==>  [xn-1,...xn-1,   xn-1,xn-2,...xk]

常用的(可理解为默认的)为算术右移。java中区别两种符号,用>>表算术右移,用>>>表逻辑右移

32位的有符号整数(c#里面是int类型),>>31,正数只能为0,负数只能为-1.(有意思的0和-1)

验证:0(正整数最高位为0) 1010.....,右移31位后,加上最前面的符号0,全部为0,则结果为0

1(负数的符号位)1010...,不论第一个1的后面31位是什么,右移31位时,算术右移补右边最高位有效值,也就是1,最终的二进制表达式为32个1,即十进制的-1.

3.-2 >> n = -1 (其中n>=1)

还是有意思的-1.

负数的二进制表达式 原码 ---> 反码 --->补码

-10的二进制表达式:

原码:00000000 00000000 00000000 00001010

反码:11111111 11111111 11111111 11110101

补码(在反码上-1): 11111111 11111111 11111111 11110100 = -10

因此,-2的二进制表达式为:11111111 11111111 11111111 11111110。看到这里,有种恍然大悟的感觉吧。

4.位移超过了数据类型最高位?

譬如:32位正整数 100 >> 60 = ?

把60%32=28 ==> 100 >> 28

时间: 2024-08-27 15:20:19

15.03.28-有意思的位运算的相关文章

[位运算] [搜索] [递推优化] [计算几何] TEST 2016.7.15

NOIP2014 提高组模拟试题 第一试试题 题目概况: 中文题目名称 合理种植 排队 科技节 源程序文件名 plant.pas/.c/.cpp lineup.pas/.c/.cpp scifest.pas/.c/.cpp 输入文件名 plant.in lineup.in scifest.in 输出文件名 plant.out lineup.out scifest.out 每个测试点时限 1s 1s 1s 测试点数目 10 10 10 每个测试点分值 10 10 10 内存上限 128MB 128

第15章 位运算

Description 已知键盘输入的单字节的数据中,存有两项信息:第2位存有性别(0代表male,1代表female),第3.4.5位存有班级(000代表1班,001代表2班,010代表3班,...,111代表8班).请编程,从输入的数据中提取这两项信息并输出.说明:每个字节的最右边是第0位 Input 输入一个单字节的数据 Output 输出两项信息 Sample Input 12 Sample Output 2,female #include <stdio.h>#include <

POJ 1166 The Clocks 位运算与BFS

1.题意:有一组3*3的只有时针的挂钟阵列,每个时钟只有0,3,6,9三种状态:对时针阵列有9种操作,每种操作只对特点的几个时钟拨一次针,即将时针顺时针波动90度,现在试求从初试状态到阵列全部指向0的状态所需要的最小操作数的操作方案: 2.输入输出:输入给出阵列初始状态,0,1,2,3分别表示0,3,6,9:要求输出最快方案的操作序列: 3.分析:IOI 1994的考题,BFS是比较容易想到的方法之一,关键是如何简洁的表示和改变BFS过程中的阵列状态:这里使用位运算的方法:具体如下: 首先一共9

【模拟+递归+位运算】POJ1753-Flip Game

由于数据规模不大,利用爆搜即可.第一次用位运算写的,但是转念一想应该用递归更加快,因为位运算没有剪枝啊(qДq ) [思路] 位运算:时间效率较低(172MS),有些辜负了位运算的初衷.首先将二维数组倒序看作一个二进制数num.我们假设1代表翻转,0代表不翻转,可以发现以下规律:0 xor 1=1,1 xor 1=0;0 xor 0=0,1 xor 0=1,恰巧满足异或运算.我们假设另一个二进制数i∈[0,2^16),通过异或运算就可以模拟出所有清形. 用check和i进行&操作可以求出以哪些位

进制、位运算笔记

进制 位运算 进制介绍 一种计数的方式,数值的表示形式. 常见的进制有:二进制.十进制.八进制和十六进制. 二进制: 0和1,C语言中表示0b开头或者0B开头. 八进制: 0,1,2,3,4,5,6,7 C语言中以0开头的数字,例如045 十进制: 自然数 十六进制: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F C语言中以0x或者0X开头的数字 进制之间的转换: 其他进制转换成十进制的三要素: 1. 数位:数码在一个数中所处的位置. 一个序列,从右往左数位依次是0,1,2,3

嵌入式C语言之位运算 &amp;..|.~.&gt;&gt;

在嵌入式编程中,掌握位运算在操作寄存器的时候很方便,由于之前在上位运算的时候没上,但是由于位运算的难度不是很大,自己编写程序,顺便做些总结. &   |   - 这三个位运算符号不难理解,但是要区别与逻辑运算符号&&  和|| 1.需要总结的是:假如要使寄存器的值为1的话,一般用 这个寄存器的值来| 上1 比如要将i的值变为1则可以使用    i   |=  1;    意思就是将i的值与上1的值再给i.同理要让一个变量的值变成0的话,将使用 &上0     例如   i&

算法学习 - 递归与非递归,位运算与乘除法速度比较

递归调用非递归调用 运行时间比较 结论 位运算与乘除法 结论 递归调用/非递归调用 我们都知道,很多算法,都是用递归实现的.当然它们同时也是可以用非递归来实现. 一般我们在对二叉树进行遍历的时候,还有求斐波那契数的时候,递归是非常简单的.代码容易懂,好实现. 但是递归的时候,有一个问题,就是需要压栈.为什么要压栈呢?因为当我在函数内部调用自身的时候,要中断当前的操作继续跳转到下一次的实现,而当前运行的状态要保存起来.所以就把当前状态进行压栈,等到运行到递归条件结束的时候,再弹栈. 所以递归就是需

使用位运算显示二进制数

最近学习<C Primer Plus>位操作部分,结合书上的编程实例来巩固这部分知识点. 1 //使用位运算显示二进制数 2 #include<stdio.h> 3 char *itobs( int, char*); //integer to binary string 4 void show_bstr( const char*); 5 main() 6 { 7 char bin_str[8 * sizeof(int) +1]; 8 int number; 9 while(scan

位运算之清除特定的某几位

在C语言中,一个32位的整数能表征32种状态.那么,要将某几种特定的状态清除掉,也就是将整数对应的某几位清除掉,有固定套路吗? Absolutely yes! 固定套路如下: FLAGS &= ~( X | Y | Z ) /* * 1. N = X | Y | Z; * 2. M = ~N; * 3. FLAGS &= M; */ 1. 将特定的某几位对应的整数X, Y, Z使用或(|)运算组合成一个新的整数N:2. 将新的整数N按位取反(~),得到新的整数M:3. 以M为基,对FLAG