java移位 java中的移位问题 程序如下
朋友们,你是否曾想过深入了解java移位和java中的移位问题 程序如下的内涵?在本文中,我将为你详细解析这两个话题,希望能给你带来全新的视角和思考。
java左移运算符的问题,一定给分!
1.左移运算符
左移运算符用“<<”表示,是将运算符左边的对象,向左移动运算符右边指定的位数,并且在低位补零。其实,向左移n位,就相当于乘上2的n次方,例如下面的例子。
public class data17
{
public static void main(String[] args)
{
int a=2;
int b=2;
System.out.println("a移位的结果是:"+(a<<b));
}
}
运行结果
a移位的结果是:8
分析上面的程序段:
首先从本质上来分析,2的二进制是00000010,它向左移动2位,就变成了00001000,即8。如果从另一个角度来分析,它向左移动2位,其实就是乘上2的2次方,结果还是8。
2.右移运算符
右移运算符用符号“>>>”表示,是将运算符左边的对象向右移动运算符右边指定的位数,并且在高位补0,其实右移n位,就相当于除上2的n次方。
public class data18
{
public static void main(String[] args)
{
int a=16;
int b=2;
System.out.println("a移位的结果是:"+(a>>>b));
}
}
运行结果
a移位的结果是:4
分析上面的程序段:从本质上来分析,16的二进制是00010000,它向右移动2位,就变成了00000100,即4。如果从另一个角度来分析,它向右移动2位,其实就是除以2的2次方,结果还是4。
3.带符号的右移运算符
带符号的右移运算符用符号“>>”表示,是将运算符左边的运算对象,向右移动运算符右边指定的位数。如果是正数,在高位补零,如果是负数,则在高位补1,先看下面一个简单的例子。
public class data19
{
public static void main(String[] args)
{
int a=16;
int c=-16;
int b=2;
int d=2;
System.out.println("a的移位结果:"+(a>>b));
System.out.println("c的移位结果:"+(c>>d));
}
}
运行结果
a的移位结果:4
c的移位结果:-4
分析上面的程序段:
a的值是16,转换成二进制是00010000,让它右移两位成00000100即4。
c的值是-16,转换成二进制是11101111,让它右移一位成11111011即-4。
java中的移位问题 程序如下
我们知道,在java中,int是占4个字节的,也就是32位。
这个程序,应该是为了将一个int类型转换成32位2进制数。
原理:
1.<<:左移运算符,在没有数字溢出的情况下,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
2.&:位运算符,当两边操作数的位同时为1时,结果为1,否则为0。如111& 101= 101。
切入正题:
1.为了取得32位完整的二进制数,需要循环32次,1<<31即2的31次方,表示最高位为1,其余31位均为0的二进制数;1<<30即2的30次方,表示第二位为1,其余31位均为0的二进制数;以此类推。
2.程序从高位开始转换int类型,我们想要截取二进制数的特定某位时,我们需要用一个此位为1,其余位均为0的二进制数来做&运算,例如,我们想截取15的最高位,我们只需使用最高位为1的32位二进制数与15做&运算即可。因为假设假设某位为1,1& 1= 1,假设某位为0,0& 1= 0,均能得到原来的数。而1或0与0相与均为0.
总之,程序是从高位到低位依次一位一位截取int对应二进制数,输出的结果便是int对应的二进制数
java中关于byte位移问题
-15
“有符号”右移位运算符(>>)则将运算符左边的运算对象向右移动运算符右侧指定的位数。“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1。对byte型进行位移操作,那么在移位进行之前,它们会自动转换成一个int,得到的结果也是int。而且对于int型的值进行位移操作,右边的操作数只有低5位有用,就是说>>3和>>35是一样的。
-114在计算机中的二进制表示为:
11111111 11111111 11111111 10001110(补码)
>>3操作(去掉后三位,前面补3个1)后为
11111111 11111111 11111111 11110001
10进制表示为-15。
java循环矩阵移位
importjava.util.Scanner;
publicclassFiveJuZheng{
publicstaticvoidmain(String[]args){
int[][]arr={{1,2,3,4,5},{6,7,8,9,10},
{11,12,13,14,15},{16,17,18,19,20},
{21,22,23,24,25}};
intx=0,y=0;
booleanflag=true;
Scannersc=newScanner(System.in);
do{
System.out.println("请输入两个位移量(注:不能超过5或者-5,用空格分开)");
Stringreadline=sc.nextLine();
String[]numbers=readline.split("");
if(numbers.length<2){
System.out.println("警告!输入有误:少于两个数!");
continue;
}
x=Integer.parseInt(numbers[0]);
y=Integer.parseInt(numbers[1]);
if(numbers.length==2&&x<5&&x>-5&&y<5&&y>-5){
flag=false;
}else{
System.out.println("警告!输入有误:数值须在(-5,5)内,不包括-5和5!");
}
}while(flag);
arr=xidc(arr,x);
arr=yidc(arr,y);
for(inti=0;i<5;i++){
for(intj=0;j<5;j++){
System.out.print(arr[i][j]+"\t");
}
System.out.println();
}
}
/**
*处理数组下沉
*@paramarr源数组
*@paramx下沉行数
*@return下沉后的数组
*/
privatestaticint[][]xidc(int[][]arr,intx){
int[]temp=newint[5];
if(x<0){
x=5+x;//输入为负时换成对应的正数行上浮2行等于下沉3行
}
for(intk=0;k<x;k++){
for(inti=4;i>0;i--){
intline=i-1;
temp=arr[i];
arr[i]=arr[line];
arr[line]=temp;
}
}
returnarr;
}
/**
*处理数组向右移动
*@paramarr源数组
*@paramy右移列数
*@return移位后数组
*/
privatestaticint[][]yidc(int[][]arr,inty){
int[]temp=newint[5];
if(y<0){
y=5+y;//输入为负时换成对应的正数行左移2列等于右移3列
}
for(intk=0;k<y;k++){
for(inti=4;i>0;i--){
intline=i-1;
for(intj=0;j<5;j++){
temp[j]=arr[j][i];
arr[j][i]=arr[j][line];
arr[j][line]=temp[j];
}
}
}
returnarr;
}
}
简测可以达到效果。
END,本文到此结束,如果可以帮助到大家,还望关注本站哦!